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

我用了两种方法:

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

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

这种方法将给出非常正确的圆形结果。

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

只需调用此方法即可。

 alert(RoundNum(192.168,2)); 

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

事实恰恰如此,以二进制表示,结果略低于 239.575。 因此, Math.round向下Math.round

要演示,试试这个:

 alert(239.575 - 239.5) 

你会期望结果为0.075,但你会得到0.07499999999998863。

只需使用Math.round

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

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

round()会做的伎俩。试试这个:

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

工作FIddle

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

另见: toFixed(2)轮次“x.525”不一致?

在我的软件中我用这个:

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