在 Javascript 中处理浮点精度

在 javascript 中有大量的数值 y。我希望将它们四舍五入到最接近的 x倍数,然后将结果转换为一个字符串。

How do I get around the annoying floating point precision?

例如:

0.2 + 0.4 = 0.6000000000000001

我试过两种方法:

>>> y = 1.23456789
>>> x = 0.2
>>> parseInt(Math.round(Math.floor(y/x))) * x;
1.2000000000000002

and:

>>> y = 1.23456789
>>> x = 0.2
>>> y - (y % x)
1.2000000000000002
260934 次浏览

来自本文: 如何处理 JavaScript 中的浮点数精度?

你有几个选择:

  • 对小数使用特殊的数据类型,如 Decimal.js
  • Format your result to some fixed number of significant digits, like this: (Math.floor(y/x) * x).toFixed(2)
  • 将所有数字转换为整数

为了完成这个任务,我首先在 x中找到小数点后的位数,然后相应地对 y进行四舍五入。我将使用:

y.toFixed(x.toString().split(".")[1].length);

它应该将 x转换成一个字符串,将它分割成小数点,找到右边部分的长度,然后 y.toFixed(length)应该根据这个长度围绕 y

你可以这样做 :

> +(Math.floor(y/x)*x).toFixed(15);
1.2

编辑: 最好使用 big.js。

大 JS

一个小型、快速、易于使用的任意精度十进制算术库。

>> bigX = new Big(x)
>> bigY = new Big(y)
>> bigY.div(bigX).round().times(bigX).toNumber() // => 1.2

看看这个链接. . 它帮了我很多。

Http://www.w3schools.com/jsref/jsref_toprecision.asp

toPrecision(no_of_digits_required)函数返回一个 string,因此不要忘记使用 parseFloat()函数将其转换为所需精度的小数点。

> var x = 0.1
> var y = 0.2
> var cf = 10
> x * y
0.020000000000000004
> (x * cf) * (y * cf) / (cf * cf)
0.02

快速解决方案:

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

您可以查看完整的解释 here