【发布时间】:2012-04-13 11:12:29
【问题描述】:
我一直在与来自 SQL 小数 (38,30) 的 C# 中的小数精度作斗争,我终于把它弄到了一个四舍五入的怪圈。我知道我可能在这里忽略了显而易见的事情,但我需要一点洞察力。
我遇到的问题是 C# 不能产生我认为是一致的输出。
decimal a = 0.387518769125m;
decimal b = 0.3875187691250002636113061835m;
Console.WriteLine(Math.Round(a, 11));
Console.WriteLine(Math.Round(b, 11));
Console.WriteLine(Math.Round(a, 11) == Math.Round(b, 11));
产量
0.38751876912
0.38751876913
False
呃,0.38751876913?真的吗?我在这里错过了什么?
来自MSDN:
如果小数位为奇数,则改为偶数。否则,保持不变。
为什么我看到不一致的结果?额外的精度不会改变“小数位中的数字”...
【问题讨论】:
-
它向下取整一个值 0.5。 (即“0.50000”向下取整,“0.50002...”向上取整) - 这不是您所期望的吗?见msdn.microsoft.com/en-us/library/ms131274.aspx
-
您希望 round 函数四舍五入到 更远的数字?你能解释一下为什么在任何情况下你会期望这种情况吗? (这不是一个修辞问题;我有兴趣了解为什么人们相信非常奇怪的事情。这个问题实际上很常见,但我仍然不明白为什么这么多人认为 round 应该四舍五入更远的数字。)
-
@EricLippert 我认为常见的误解源于小学数学课通过查看下一个数字来教授四舍五入的事实。如果那个数字是 5,我们会学习四舍五入。然后我们了解银行家的四舍五入,许多人错误地假设“四舍五入到最接近的偶数”适用于下一个数字是 5。当然,它仅适用于下一个数字是5 并且在那之后没有更多的非零数字。即使是 Oded 引用的文档也具有误导性:如果您严格阅读它,
1.0005中的单个非零5数字将导致2的返回值。 -
我想我的问题与对 MSDN 文档的误解有关。它似乎说明“如果数字在小数位”。对我来说,这意味着“我们只看那个数字来做出决定”。你说的很有道理,但我只是在文档中看不到这一点。即使再看一遍。我会重新阅读该文档,看看您的反馈是否更清楚。
-
但是“四舍五入”规则是一个平局规则; 当已经有明确的赢家时,您不会应用平局规则。