Dealing with float precision in Javascript
本问题已经有最佳答案,请猛点这里访问。
我在javascript中有大量的数字值
如何绕过恼人的浮点精度?
例如:
1 | 0.2 + 0.4 = 0.6000000000000001 |
我试过两件事:
1 2 3 4 | >>> y = 1.23456789 >>> x = 0.2 >>> parseInt(Math.round(Math.floor(y/x))) * x; 1.2000000000000002 |
号
还有:
1 2 3 4 | >>> y = 1.23456789 >>> x = 0.2 >>> y - (y % x) 1.2000000000000002 |
从这篇文章:如何处理javascript中的浮点数精度?
您有几个选择:
- 对小数使用特殊的数据类型,如decimal.js
- 将结果格式化为固定的有效位数,如下所示:
(Math.floor(y/x) * x).toFixed(2) 。 - 将所有数字转换为整数
1 2 3 4 5 6 7 | > var x = 0.1 > var y = 0.2 > var cf = 10 > x * y 0.020000000000000004 > (x * cf) * (y * cf) / (cf * cf) 0.02 |
快速解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | var _cf = (function() { function _shift(x) { var parts = x.toString().split('.'); return (parts.length < 2) ? 1 : Math.pow(10, parts[1].length); } return function() { return Array.prototype.reduce.call(arguments, function (prev, next) { return prev === undefined || next === undefined ? undefined : Math.max(prev, _shift (next)); }, -Infinity); }; })(); Math.a = function () { var f = _cf.apply(null, arguments); if(f === undefined) return undefined; function cb(x, y, i, o) { return x + f * y; } return Array.prototype.reduce.call(arguments, cb, 0) / f; }; Math.s = function (l,r) { var f = _cf(l,r); return (l * f - r * f) / f; }; Math.m = function () { var f = _cf.apply(null, arguments); function cb(x, y, i, o) { return (x*f) * (y*f) / (f * f); } return Array.prototype.reduce.call(arguments, cb, 1); }; Math.d = function (l,r) { var f = _cf(l,r); return (l * f) / (r * f); }; > Math.m(0.1, 0.2) 0.02 |
。
您可以在这里查看完整的解释。
你可以这样做:
1 2 | > +(Math.floor(y/x)*x).toFixed(15); 1.2 |
号
查看此链接….它帮了我很多忙
http://www.w3schools.com/jsref/jsref_toprection.asp
TopPrecision(不需要数字)函数返回一个字符串,因此不要伪造使用parseFloat()函数转换为req精度的小数点。
为了完成这项任务,我首先在
1 | y.toFixed(x.toString().split(".")[1].length); |
它应该把