我一直在争取C#中的十进制精度来自一个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.5的值。 (即“0.50000”被取整,“0.50002 ...”被取整) - 这不是你期望的吗?请参阅http://msdn.microsoft.com/en-us/library/ms131274.aspx – 2012-04-12 16:13:36
@Jason Williams:不完全。如果小于0.5,则向下舍入,如果> 0.5,则向上舍入,然后如果== 0.5则使用银行家舍入。 – jason 2012-04-12 16:21:58
您期待的圆形函数可以舍入*更远的数字*?你能解释为什么你会期望在任何情况下? (这不是一个反问题的问题,我有兴趣了解为什么人们会相信很奇怪的东西,这个问题其实很常见,但我仍然不明白为什么那么多人认为* round *应该围绕* number更远*) – 2012-04-12 16:35:18