js 四舍五入方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/waa_0618/article/details/80707260

最近发现JS当中toFixed()方法存在一些问题,采用原生的Number对象的原型对象上的toFixed()方法时,规则并不是所谓的“四舍五入”或者是“四舍六入五成双”,所谓“四舍六入五成双”,在百度百科上给的解释是:也即“4舍6入5凑偶”这里“四”是指≤4 时舍去,”六”是指≥6时进上,”五”指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:①5前为奇数,舍5入1;②5前为偶数,舍5不进。(0是最小的偶数) 。百度百科上涉及的几个例子在实际情况下确实成立,但不科学,并不能覆盖所有的情况。
为了实现四舍五入,我重写了一个四舍五入的方法,仅供参考。

function roundUtils2(srcValuef) {
    var iCount = 2;
    var srcValue = srcValuef;

    var zs = true;

    //判断是否是负数
    if ( srcValue < 0 )
    {
        srcValue = Math.abs(srcValue);
        zs = false;
    }

    var iB = Math.pow(10, iCount);

    //有时乘100结果也不精确
    var value1 = srcValue * iB;

    var anumber = new Array();
    var anumber1 = new Array();

    var fvalue = value1;
    var value2 = value1.toString();
    var idot = value2.indexOf(".");

    //如果是小数
    if ( idot != -1 )
    {
        anumber = srcValue.toString().split(".");

        //如果是科学计数法结果
        if ( anumber[1].indexOf("e") != -1 )
        {
            return Math.round(value1) / iB;
        }

        anumber1 = value2.split(".");

        if ( anumber[1].length <= iCount )
        {
            return parseFloat(srcValuef,10);
        } 

        var fvalue3 = parseInt(anumber[1].substring(iCount,iCount+1),10);

        if ( fvalue3 >= 5 )
        {
            fvalue = parseInt(anumber1[0],10) + 1;
        } 
        else 
        {
            //对于传入的形如111.834999999998 的处理(传入的计算结果就是错误的,应为111.835)
            if ( fvalue3 == 4 && anumber[1].length > 10 && parseInt(anumber[1].substring(iCount+1,iCount+2),10) == 9 )
            {
                fvalue = parseInt(anumber1[0],10) + 1;
            } 
            else 
            {
                fvalue = parseInt(anumber1[0],10);
            }
        }
    }
    //如果是负数就用0减四舍五入的绝对值
    if ( zs )
    {
        return fvalue / iB;
    } 
    else 
    {
        return 0 - fvalue / iB;
    }
}

猜你喜欢

转载自blog.csdn.net/waa_0618/article/details/80707260