jquery Math.round()和.toFixed()中的舍入问题

inn6fuwd  于 2023-04-20  发布在  jQuery
关注(0)|答案(8)|浏览(212)

我使用了以下两种方法:

Number.prototype.myRound = function (decimalPlaces) {
    var multiplier = Math.pow(10, decimalPlaces);

    return (Math.round(this * multiplier) / multiplier);
};
alert((239.525).myRound(2));

数学上alert应该是239.53,但它给出239.52作为输出。所以我尝试使用.toFixed()函数,我得到了正确的答案。
但是当我试图得到239.575的答案时,它又给出了错误的输出。

alert((239.575).toFixed(2));

这里的输出应该是239.58,而不是给出239.57
这个错误在最终输出中产生了一点差异。所以有人能帮我解决这个问题吗?

bgibtngc

bgibtngc1#

这种方法将给予非常正确的轮结果。

function RoundNum(num, length) { 
    var number = Math.round(num * Math.pow(10, length)) / Math.pow(10, length);
    return number;
}

只调用这个方法。

alert(RoundNum(192.168,2));
ws51t4hk

ws51t4hk2#

在内部,239.575不能被精确地表示。在二进制中,0.575将是1/2 + 1/16 + 1/128 + 1/256 +...。
碰巧,用二进制表示,结果 * 略 * 小于239.575。因此,Math.round向下舍入。
要演示,请尝试以下操作:

alert(239.575 - 239.5)

你会期望结果是0.075,但实际上你得到的是0.0749999999998863。

jckbn6z7

jckbn6z73#

使用Math.round即可

function round(figureToRound){
    var roundOff = Math.round((figureToRound* 100 ).toFixed(2))/100;
    return roundOff;
}

console.log(round(1.005));

这将有助于四舍五入的问题完全。

djmepvbi

djmepvbi4#

round()就可以了。试试这个:

var v= Math.round(239.575 * 100) / 100;
alert(v);

Working FIddle

hgc7kmma

hgc7kmma5#

问题可能是浮点数不准确,因此在不同的情况下(不同的数字收集,不同的浏览器等)可能会得到不同的结果。
另请参阅:toFixed(2) rounds "x.525" inconsistently?

f1tvaqid

f1tvaqid6#

在我的软件中,我使用这个:
(需要DecimalJS

Number.prototype.toFixed = function(fixed) {
    return (new Decimal(Number(this))).toFixed(parseFloat(fixed) || 
0);
};

var x = 1.005;
console.log( x.toFixed(2) ); //1.01
ar7v8xwq

ar7v8xwq7#

function bestRound(val, decimals){
    decimals = decimals || 2;
    var multiplier = Math.pow(10, decimals)
    return Math.round((val * multiplier ).toFixed(decimals)) / multiplier;
  }

bestRound(239.575 - 239.5)   0.08
bestRound(239.575)         239.58
bestRound(239.525)         239.53
bestRound(1.005)             1.01
jxct1oxe

jxct1oxe8#

我得到了这个简单地覆盖它-〉

Number.prototype.toFixed = function(fractionDigits, returnAsString = true) {
    var digits = parseInt(fractionDigits) || 0;
    var num = Number(this);
    if( isNaN(num) ) {
        return 'NaN';
    }
    
    var sign = num < 0 ? -1 : 1;
    if (sign < 0) { num = -num; }
    digits = Math.pow(10, digits);
    num *= digits;
    //num = Math.round(num.toFixed(12));
    num = Math.round( Math.round(num * Math.pow(10,12)) / Math.pow(10,12) );
    var ret = sign * num / digits;
    return (returnAsString ? ret.toString() : ret ); // tofixed returns as string always
}

相关问题