c# - 为什么 System.MidpointRounding.AwayFromZero 在这种情况下不四舍五入?

标签 c# .net

在 .NET 中,为什么 System.Math.Round(1.035, 2, MidpointRounding.AwayFromZero) 产生 1.03 而不是 1.04?我觉得我的问题的答案在 http://msdn.microsoft.com/en-us/library/ef48waz8.aspx 标有“来电者注意事项”的部分。 ,但我无法理解这个解释。

最佳答案

你的怀疑是完全正确的。带小数部分的数字在 .NET 中表示为文字时,默认为 doubles . double (如 float )是十进制值的近似值,而不是精确的十进制值。它是可以用 base-2(二进制)表示的最接近的值。在这种情况下,近似值在 1.035 的较小一侧几乎消失了。如果您使用显式 Decimal 编写它,它会按您预期的那样工作:

Console.WriteLine(Math.Round(1.035m, 2, MidpointRounding.AwayFromZero));
Console.ReadKey();

要理解为什么 double 和 float 以它们的方式工作,想象一下用十进制(或二进制,也有同样的问题)表示数字 1/3。你不能 - 它转换为 .3333333....,这意味着准确地表示它需要无限量的内存。

计算机使用近似值来解决这个问题。我会准确地解释如何,但我可能会弄错。你可以在这里阅读所有相关信息:http://en.wikipedia.org/wiki/IEEE_754-1985

关于c# - 为什么 System.MidpointRounding.AwayFromZero 在这种情况下不四舍五入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9221205/

相关文章:

c# - Winform应用,window最小化强制垃圾回收?

c# - 如何在 OnRender 中重绘或刷新?

c# - SmtpFailedRecipientException 和 SmtpFailedRecipientsException

c# - 多线程设计模式

.net - "Common Sense"或实用 .NET 编码标准

c# - 如何在 C# 中将小数转换为整数?

c# - 在有显式迁移挂起时添加迁移

c# - 我应该将所有 WCF 服务代码包装在一个 try catch block 中吗?

java - 如何避免 DB4o 数据库中的重复对象

.net - 如果使用 LINQ 进行查询,我们是否需要对排序进行单元测试?