我一直在与来自 SQL Decimal (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));
Yields
0.38751876912
0.38751876913
False
呃,0.38751876913?真的吗?我在这里缺少什么?
From MSDN http://msdn.microsoft.com/en-us/library/ms131275.aspx:
如果小数位上的数字是奇数,则将其更改为偶数。否则,它保持不变。
为什么我看到的结果不一致?额外的精度不会改变“小数位中的数字”......
来自 MSDN:
如果有一个非零数字d
向右 of the decimals
小数点位置它的值为5
,小数点位置上的数字如果是奇数则四舍五入,或者如果是偶数则保持不变. If d
小数位数少于decimals
, d
返回原样。
在你的第一种情况下
decimal a = 0.387518769125m;
Console.WriteLine(Math.Round(a, 11));
there 右边是一位数字第11名中,这个数字是5
。所以,由于位置 11 是偶数,因此保持不变。因此,你得到
0.38751876912
在你的第二种情况下
decimal b = 0.3875187691250002636113061835m;
Console.WriteLine(Math.Round(b, 11));
there 右边不是一位数字第 11 位。因此,这是直接对小学进行四舍五入;如果下一个数字大于 4,则向上舍入,否则向下舍入。由于第 11 位右边的数字大于 4(是 5),因此我们四舍五入,以便您看到
0.38751876913
为什么我看到的结果不一致?
你不。结果与文档完全一致。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)