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

时间:2013-12-20 10:04:46

标签: javascript jquery

我使用了以下两种方法:

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

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

数学警报应该是239.53,但是它会将239.52作为输出。 所以我尝试使用.toFixed()功能&我得到了正确的答案。

但是当我试图获得239.575的答案时,它再次给出错误的输出。

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

此输出应为239.58,而不是其239.57

此错误在最终输出中产生一点差异。那么有人可以帮我解决这个问题吗?

7 个答案:

答案 0 :(得分:8)

此方法将给出非常正确的舍入结果。

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

请调用此方法。

alert(RoundNum(192.168,2));

答案 1 :(得分:6)

在内部,239.575无法准确表示。在二进制中,0.575将类似于1/2 + 1/16 + 1/128 + 1/256 + ....

恰好如此,以二进制表示,结果小于239.575。因此,Math.round向下舍入。

要演示,试试这个:

alert(239.575 - 239.5)

您希望结果为0.075,而是获得0.07499999999998863。

答案 2 :(得分:3)

只需使用Math.round

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

console.log(round(1.005));

这将有助于彻底解决问题。

答案 3 :(得分:2)

round()会做到这一点。试试这个:

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

<强> Working FIddle

答案 4 :(得分:2)

问题可能是浮点不准确,因此在不同情况下可能会得到不同的结果(不同的数字收集,不同的浏览器等)。

另见:toFixed(2) rounds "x.525" inconsistently?

答案 5 :(得分:0)

在我的软件中,我使用它:

(需要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

答案 6 :(得分:0)

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