在 .NET 中,为什么System.Math.Round(1.035, 2, MidpointRounding.AwayFromZero)
产量 1.03 而不是 1.04?我觉得我的问题的答案就在标有“来电者须知”的部分中http://msdn.microsoft.com/en-us/library/ef48waz8.aspx http://msdn.microsoft.com/en-us/library/ef48waz8.aspx,但我无法理解这个解释。
你的怀疑是完全正确的。当在 .NET 中表示为文字时,带小数部分的数字默认为doubles http://msdn.microsoft.com/en-us/library/678hzkk9.aspx。双精度数(如浮点数)是十进制值的近似值,而不是精确的十进制值。它是可以以 2 为基数(二进制)表示的最接近的值。在这种情况下,近似值在 1.035 的较小一侧几乎为零。如果您使用显式 Decimal 编写它,它会按您的预期工作:
Console.WriteLine(Math.Round(1.035m, 2, MidpointRounding.AwayFromZero));
Console.ReadKey();
要理解为什么双精度和浮点数以它们的方式工作,想象一下用十进制(或二进制,也有同样的问题)表示数字 1/3。你不能——它翻译成 .3333333....,这意味着要准确地表示它需要无限量的内存。
计算机使用近似值来解决这个问题。我会准确地解释如何,但我可能会弄错。不过,您可以在这里阅读所有相关内容:http://en.wikipedia.org/wiki/IEEE_754-1985 http://en.wikipedia.org/wiki/IEEE_754-1985
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)