为什么Convert.ToInt32()舍入到最接近的偶数,而不是最接近的整数?

Cur*_*urt 20 c# decimal int32 rounding

查看Convert.ToInt32()它的msdn文档说明:

如果值在两个整数之间,则返回偶数; 也就是说,4.5转换为4,5.5转换为6.

http://msdn.microsoft.com/en-us/library/ffdk7eyz.aspx

为什么是这样?

当然,舍入到最接近的整数更合乎逻辑,不是吗?如果是这样,4.5将变为5,而5.5将变为6,这似乎更直观.

Ada*_*rth 13

Rounding维基百科条目的历史部分对计算中"round to even"的作用有一些陈述.有趣的是,看起来"Bankers Rounding"几乎没有证据表明它在任何意义上都是官方的,因此只能用作俚语术语.

如果您订阅该舍入机制,那只是"更合乎逻辑".四舍五入(在这种情况下是默认值)也是完全符合逻辑的.

想象一下,如果银行的每一小部分金额都汇总到最接近的便士,那么每天处理的数百万交易将会减少很多(对于愤世嫉俗的人而言)损失很多钱.好的,所以这个例子是愤世嫉俗的.

走向最接近的偶数(或奇数,但历史选择否则)意味着并非每个舍入分辨率都会上升,有些可能会下降.当你把它置于平均律时,在考虑负责支付额外的半便士时,它就成为一个公平的解决方案.

至于为什么选择这个框架,这个问题试图解决它:

为什么.NET使用银行家的舍入作为默认值?

当然,这一切都可以追溯到金融时代,它对整数的适用性可能会受到质疑,但为什么还要费心呢?接受它,如果你想要覆盖它,只需了解它是如何工作的.


对于想知道如何更改默认舍入的人:

如果你提供一个非整数,Convert.ToInt32你首先需要做一些事情Convert.ToDouble,然后Math.Round用重载来改变舍入逻辑.

  • @musefan但是在银行业的世界里,是不是赚了更少的钱等于失去它?你也在这个国家,你应该和银行一样对银行充满冷嘲热讽 (2认同)

Jam*_*iec 5

这就是为什么将MidpontRounding重载添加到的原因Math.Round

因此,为了正确舍入,应该使用Math.Round而不是Convert.ToInt32。