为什么Convert.ToInt32()四舍五入到最接近的偶数,而不是最接近的整数?查看Convert.ToInt32()的msdn文档,它指出:如果值介于两个整数之间,则返回偶数;也就是说,4.5转换为4,5.5转换为6。http://msdn.microsoft.com/en-us/library/ffdk7eyz.aspx为什么会这样?当然,舍入到最接近的整数更符合逻辑,不是吗?这样的话4.5就变成5,5.5就变成6,这样看起来更直观。Rounding维基百科条目的历史部分有一些关于“舍入到偶数”在计算中的作用的陈述。有趣的是,“BankersRounding”似乎没有任何证据表明它是官方的,因此只能用作俚语。如果您订阅该舍入机制,它只会“更合乎逻辑”。四舍五入(本例中为默认值)也完全合乎逻辑。想象一下,如果银行金额的每一部分都四舍五入到最接近的一分钱,那么每天处理的数百万笔交易将节省很多(对于愤世嫉俗的人)。好的,所以这个例子是愤世嫉俗的。转到最接近的偶数(或奇数,但历史另有选择)意味着并非每个舍入分辨率都会上升,有些可能会下降。当你把它纳入平均法则时,在考虑谁负责支付额外的半便士时,它就变成了一个公平的解决方案。至于为什么选择这个框架,这个问题试图解决它:Whydoes.NETusebanker'sroundingasdefault?当然,这一切都可以追溯到金融时代,它对整数的适用性可能会受到质疑,但何必呢?接受它,如果你想覆盖它,只需要了解它是如何工作的。对于想知道如何更改默认舍入的任何人:如果您要为Convert.ToInt32提供一个非整数,您首先需要执行一些重载,例如Convert.ToDouble和Math.Round来更改舍入逻辑。这正是MidpontRounding重载添加到Math.Round的原因。因此,为了正确舍入,您应该使用Math.Round而不是Convert.ToInt32。是不考虑MidpointRounding.ToEven(庄家舍入)还是MidpointRounding.AwayFromZero这个主观问题会更好。在设计时,Microsoft考虑了.NET旨在替代的语言。因此,在设计.NET时,类库提供Floor、Ceiling和Round方法,并且Round行为默认为VB的行为,这似乎是合理的。Convert.ToInt32()使用Round方法似乎也是合理的(尽管我认为Floor可以与cast保持一致)。如果您想要此行为,则需要使用Math.Round并指定MidpointRounding.AwayFromZero。例如:intresult=(int)Math.Round(4.5,MidpointRounding.AwayFromZero);Demo:http://ideone.com/ZAbBLConvert.ToInt32(double)本身并没有使用Math.Round,而是这样实现的(ILSpy):以上是C#学习教程:Convert.ToInt32()WhydoesConvert.ToInt32()round到最接近的偶数而不是最接近的整数?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——publicstaticintToInt32(doublevalue){if(value>=0.0){if(value0.5||(num2==0.5&&(num&1)!=0)){num++;}返回数;}}else{if(value>=-2147483648.5){intnum3=(int)value;doublenum4=value-(double)num3;if(num4本文采集自网络,不代表立场,如涉及侵权,请点右联系管理员删除,如需转载请注明出处:
