我使用的是 Visual Studio Professional 2012。
我创建了一个新的 C# ConsoleApplication,针对 .NET Framework 4.5,代码如下:
static void Main(string[] args)
{
double x = 2.44445;
double y = Math.Round(x, 4, MidpointRounding.AwayFromZero);
Console.WriteLine(y);
Console.ReadKey();
}
预期结果应为 2.4445,但实际返回 2.4444。
//与之前的框架版本结果相同,我尝试了VCE2010。
我知道这样的问题通常是由双精度数据类型的存储方式引起的(即有限小数转换为无限二进制分数)。但我没想到只有 5 位小数就会发生这种情况,比如 2.44445
我担心这样的事情是否会发生在更短的小数位上。我还想学习一种在 C# 中进行舍入的更安全的方法(使用远离零的约定)。
谢谢。
这确实是由于浮点数的精度脆弱造成的。 0.5 可以完美地存储在 IEEE 浮点中,但 0.45、0.445 等则不能。例如,指定 2.44445 时存储的实际值是 11009049289107177/4503599627370496,即 2.44449999999999989519494647...现在应该很明显为什么数字会这样舍入。
如果您需要精确存储小数,请考虑使用decimal
改为键入。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)