Convert.Toint32(double value)取整时的四舍六入五成双规则

Convert.ToInt32()在转换小数到整数时遵循奇进偶舍规则,也称为四舍六入五成双或银行家舍入法。当数值处于两个整数之间时,如4.5,它会选择更接近的偶数作为结果。这种规则在统计上能减少舍入误差的积累,确保舍入结果的平均误差为零。文章详细解释了该方法的内部实现和舍入策略。
摘要由CSDN通过智能技术生成

用Convert.Toint32()给小数转换成整数时,会四舍五入。比如:

Convert.Toint32(4.1) = 4
Convert.Toint32(4.3) = 4
Convert.Toint32(4.51) = 5
Convert.Toint32(4.6) = 5

但是,如果小数后面是.5 或者.50 之类的中间数,转换后的结果就让大家意向不到了。总之,结果是:
如果value为两个整数中间的数字,则返回二者中的偶数。
比如Convert.Toint32(3.5),3.5是整数3和4之间的数,此时取偶数4
比如Convert.Toint32(4.5),4.5是整数4和5之间的数,此时取偶数4

看看Convert.Toint32()官方具体的实现:

public static int ToInt32(double value)
{
    if (value >= 0)
    {
        if (value < 2147483647.5)
        {
            int result = (int)value;
            double dif = value - result;
            if (dif > 0.5 || dif == 0.5 && (result & 1) != 0) result++;
            return result;
        }
    }
    else
    {
        if (value >= -2147483648.5)
        {
            int result = (int)value;
            double dif = value - result;
            if (dif < -0.5 || dif == -0.5 && (result & 1) != 0) result--;
            return result;
        }
    }
    throw new OverflowException(SR.Overflow_Int32);
}

从这里我们看到了if (dif > 0.5 || dif == 0.5 && (result & 1) != 0) result++;if (dif < -0.5 || dif == -0.5 && (result & 1) != 0) result--;这两行代码,这里的在四舍五入里大于0.5的直接进位,但是等于0.5的还要判断是否是奇数,是奇数才会去进位。

这叫奇进偶舍,又称为四舍六入五成双规则、银行进位法(Banker's Rounding),是一种计数保留法,是一种数字修约规则。从统计学的角度,“奇进偶舍”比“四舍五入”更为精确:在大量运算时,因为舍入后的结果有的变大,有的变小,更使舍入后的结果误差均值趋于零。而不是像四舍五入那样逢五就进位,导致结果偏向大数,使得误差产生积累进而产生系统误差。“奇进偶舍”使测量结果受到舍入误差的影响降到最低。其具体要求举例如下(以保留两位小数为例):
(1)要求保留位数的后一位如果是4,则舍去。例如5.214保留两位小数为5.21。
(2)如果保留位数的后一位如果是6,则进上去。例如5.216保留两位小数为5.22。
(3)如果保留位数的后一位如果是5,而且5后面不再有数,要根据应看尾数“5”的前一位决定是舍去还是进入: 如果是奇数则进入,如果是偶数则舍去。例如5.215保留两位小数为5.22; 5.225保留两位小数为5.22。
(4)如果保留位数的后一位如果是5,而且5后面仍有数。例如5.2254保留两位小数为5.23,也就是说如果5后面还有数据,则无论奇偶都要进入。

原文:Convert.Toint32(double value)取整时的四舍六入五成双规则 - 董川民

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值