以下适用:
var rounded = Decimal.Round(7.635m, 2);
//rounded: 7.63
对我来说,这是错误和意想不到的行为。我假设舍入的值为 7.64 。
为实现这一目标,我可以做到:
var rounded = Decimal.Round(7.635m, 2, MidpointRounding.AwayFromZero);
//rounded: 7.64
不如何成为Decimal.Round
的默认行为?有什么好理由吗?
答案 0 :(得分:16)
这怎么可能不是Decimal.Round的默认行为?好不好 原因是什么?
如果您查看Decimal.Round Method (Decimal)
的文档此方法的行为遵循IEEE标准754第4节。 这种舍入有时被称为圆形的一半甚至或 银行家的四舍五入。它最大限度地减少了由此产生的舍入误差 始终在单个方向上舍入中点值。它是 相当于调用Round(Decimal,MidpointRounding)方法 MidpointRounding.ToEven的模式参数。
答案 1 :(得分:3)
来自Math.Round(Decimal, Int32)
方法
此方法的行为遵循IEEE标准754第4节 有时候称为四舍五入到最近,或者是银行家 四舍五入。它最大限度地减少了始终如一的舍入误差 在单一方向上舍入中点值。
此方法相当于使用模式调用Round方法 MidpointRounding.ToEven的参数。如果有一个非零 d位于小数位小数点右侧的数字及其值 是5,小数位的数字如果是奇数则向上舍入, 如果是偶数则保持不变。如果d的小数位数小于 小数,d不变。
答案 2 :(得分:0)
原因是他们实施了遵循IEEE标准754第4节的方法。 这被称为四舍五入到最近或有时银行家四舍五入。
这只是进行四舍五入的众多方法之一,他们选择了这个。 请参阅:http://en.wikipedia.org/wiki/Bankers_rounding