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