这个问题已经有了答案:
Why does System.MidpointRounding.AwayFromZero not round up in this instance?
5个答案
我在c(.net)中遇到一个奇怪的实例,我认为框架中的舍入不正确。

Math.Round(9.995, 2, MidpointRounding.AwayFromZero)

当我把这个值四舍五入的时候,我会得到9.99。如果将中点rounding.awayfromzero设置为这个逻辑,我的假设是它将被舍入到10。案例说明:
Math.Round(9.95, 1, MidpointRounding.AwayFromZero)

轮到10轮。这些结果似乎不一致,但有谁能解释为什么或我能做什么来帮助确保适当的舍入应用?
谢谢!

最佳答案

这是关于浮点数及其精度的工作
事实上,9.95表示为9.94999885559079,其结果与累积浮点精度误差后的结果接近10
https://en.wikipedia.org/wiki/Floating-point_arithmetic#Accuracy_problems
如果需要精确的值,请使用decimal

Math.Round(9.995m, 2, MidpointRounding.AwayFromZero); // 10

您也不应该使用“==”运算符比较浮点数,但请检查它是否“足够接近”。看这篇文章:Floating point comparison functions for C#

10-07 15:46