Javascript toFixed Not Rounding

我正在使用JavaScript绑定到一些checkbox,并toFixed(2)不是四舍五入。 任何想法,为什么它不是四舍五入? 例如,如果数字是859.385 ,则只显示859.38而不是859.39

我也读过, toFixed可以取决于你使用的是哪种浏览器,任何人都知道这种方式,以便我的JavaScript计算符合我的PHP计算不同圆形可以?

 var standardprice = parseFloat($('#hsprice_'+this.id.split('_')[1]).val()); var price = parseFloat($('#hprice_'+this.id.split('_')[1]).val()); var discount = parseFloat($('#hdiscount_'+this.id.split('_')[1]).val()); var deposit = parseFloat($('#hdeposit_'+this.id.split('_')[1]).val()); var currSprice = parseFloat($('#hTotalSprice').val()); var currPrice = parseFloat($('#hTotalPrice').val()); var currDiscount = parseFloat($('#hTotalDiscount').val()); var currDeposit = parseFloat($('#hTotalDeposit').val()); currSprice += standardprice; currPrice += price; currDiscount += discount; currDeposit += deposit; $('#lblTotalSprice').text('$'+addCommas(currSprice.toFixed(2))); $('#lblTotalPrice').text('$'+addCommas(currPrice.toFixed(2))); $('#lblTotalDiscount').text('$'+addCommas(currDiscount.toFixed(2))); $('#lblTotalDeposit').text('$'+addCommas(currDeposit.toFixed(2))); $('#hTotalSprice').val(currSprice.toFixed(2)); $('#hTotalPrice').val(currPrice.toFixed(2)); $('#hTotalDiscount').val(currDiscount.toFixed(2)); $('#hTotalDeposit').val(currDeposit.toFixed(2)); 

我还没有find一个数字,toFixed10错了。 其他人可以吗?

感谢blg和他的回答 ,指出了Mozilla的toFixed10()方法。

用这个,我想出了这个简短的一行,确实涵盖了这里提到的所有情况。

 function toFixed( num, precision ) { return (+(Math.round(+(num + 'e' + precision)) + 'e' + -precision)).toFixed(precision); } 

在Chrome中, toFixed()循环:

 859.385 ==> 859.38 859.386 ==> 859.39 

当我看看.toFixed() (第15.7.4.5节) 的ECMAScript第5版规范时 ,我没有看到它明确地描述四舍五入,尽pipe它确实描述了一些可能是Chrome已经实现的钝的东西。

在我看来,如果你想用明确的四舍五入来控制它,那么你应该使用常用的build议方法:

 var roundedNum = (Math.round( num * 100 ) / 100).toFixed(2); 

这将保证你得到可预测的舍入,就像你习惯的那样。

在这里工作演示: http : //jsfiddle.net/jfriend00/kvpgE/

与35.855一起尝试的另一个好数字是1.005

我不认为罗伯特·梅塞尔的解决scheme处理1.005

这里舍入十进制的例子https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round将数字转换为指数表示法,似乎得到更好的结果。;

我在http://jsfiddle.net/cCX5y/2/上创build了一个小提琴,它演示了上面的本地Robert Messerle示例(称为toFixedB )和Mozilla文档中的一个(称为toFixed10 )。

我还没有find一个数字,toFixed10错了。 其他人可以吗?

我把它作为一个最好的四舍五入function用于所有的财务数据。 你可以testing所有有问题的数字。 JavaScript允许某种精度,所以我用它使几乎每个数字按预期四舍五入。

 function roundTo(n, digits) { if (digits === undefined) { digits = 0; } var multiplicator = Math.pow(10, digits); n = parseFloat((n * multiplicator).toFixed(11)); return Math.round(n) / multiplicator; } 
 function roundup(num,dec){ dec= dec || 0; var s=String(num); if(num%1)s= s.replace(/5$/, '6'); return Number((+s).toFixed(dec)); } var n= 35.855 roundup(n,2) 

/ *返回值:(数字)35.86 * /

您可以使用Math.round()四舍五入数字。 如果你想四舍五入到一个特定的小数点,你可以使用一个小math:

 var result=Math.round(original*100)/100 

我偶然发现这个问题,为什么Number.toFixed行为奇怪。 我看到本地函数是不可靠的,这是不幸的。 出于好奇, 35.855看看答案,我发现TJ Crowder慷慨地对每一个人发表了评论,他们中的大多数人的performance并不正确。

也许这会回答你的问题。

 function toFixed(n,precision) { var match=RegExp("(\\d+\\.\\d{1,"+precision+"})(\\d)?").exec(n); if(match===null||match[2]===undefined) { return n.toFixed(precision); } if(match[2]>=5) { return (Number(match[1])+Math.pow(10,-precision)).toFixed(precision); } return match[1]; } 

正则expression式将你的数字分割成一个string数组,例如toFixed(35.855,2)["35.855", "35.85", "5"] 。 如果最后一个数字(在精度截止之后) >=5 ,则将Math.pow(10, -precision)到修剪的数字。 如果你以2位小数切断, .002在3,如此等等,这将增加.01

我不知道这是否是万无一失的,因为它仍然执行十进制math浮动可能是不可预知的。 我可以说35.85535.86

我今天遇到了同样的问题,甚至在其他答案中尝试了一些build议,结果发现我还没有收到我期望的结果。 最后,因为我正在使用AngularJS来处理当前的项目,所以我想我会检查AngularJS是否已经解决了同样的问题,事实上他们已经解决了。 这是他们使用的解决scheme,它完全适合我:

 function toFixed(number, fractionSize) { return +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize); } 

在这里find: AngularJS filters.js源码

这可能有帮助

  tofix2Decimals=function(float){ if(parseInt(float)==float)return float.toFixed(2); $decimals=/\.(\d+)/.exec(float)[1].length; $decimals=$decimals>=2?$decimals+1:3; float+=Math.pow(10,-$decimals); return float.toFixed(2); } 

这是由于JavaScript的浮点表示。

尝试这个:

 Number.prototype.round = function(digits) { digits = Math.floor(digits); if (isNaN(digits) || digits === 0) { return Math.round(this); } if (digits < 0 || digits > 16) { throw 'RangeError: Number.round() digits argument must be between 0 and 16'; } var multiplicator = Math.pow(10, digits); return Math.round(this * multiplicator) / multiplicator; } Number.prototype.fixed = function(digits) { digits = Math.floor(digits); if (isNaN(digits) || digits === 0) { return Math.round(this).toString(); } var parts = this.round(digits).toString().split('.'); var fraction = parts.length === 1 ? '' : parts[1]; if (digits > fraction.length) { fraction += new Array(digits - fraction.length + 1).join('0'); } return parts[0] + '.' + fraction; } 

用法:

 var n = 859.385; console.log(n.round(2)); // 859.39 console.log(n.fixed(2)); // 859.39 console.log(n.round(4)); // 859.385 console.log(n.fixed(4)); // 859.3850 

MDM具有强大的四舍五入实施 。 大多数情况下,如果不是所有的答案都更准确。

由于在JavaScripts'toFixed-function中,浮点数5不属于整数的上半部分,所以给定的数字向下舍入,如果你有这样的数字:

859.385.toFixed(2) // results in 859.38

事实上,你可能会追加像下面这样的尾随浮点数(零除外):

859.3851.toFixed(2) // results in 859.39

因此,开发人员往往会添加像0.00000000001这样的数字,以便四舍五入,并且不会意外地更改数字的值。

所以我想出了一个函数,根据你想要你的浮点数被固定的数字来添加这样一个数字:

  // both parameters can be string or number function toFixed(number, decimals) { return (Number(number) + 1 / Math.pow(10, Number(decimals) + 1)).toFixed(decimals) } toFixed(859.385, 2) //results in 859.39