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
我在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.855
到35.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