关于浮点:在Javascript中处理浮点精度

Dealing with float precision in Javascript

本问题已经有最佳答案,请猛点这里访问。

我在javascript中有大量的数字值y。我想通过将它们四舍五入到最接近的x的倍数来对它们进行分组,并将结果转换为字符串。

如何绕过恼人的浮点精度?

例如:

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精度的小数点。


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

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

它应该把x转换成一个字符串,把它除以小数点,找出右边部分的长度,然后y.toFixed(length)根据这个长度把y取整。