116

yjavascriptに大量の数値があります。それらを最も近い倍数に切り捨ててグループ化しx、結果を文字列に変換したいと思います。

煩わしい浮動小数点の精度を回避するにはどうすればよいですか?

例えば:

0.2 + 0.4 = 0.6000000000000001

私が試した2つのこと:

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

と:

>>> y = 1.23456789 
>>> x = 0.2 
>>> y - (y % x)
1.2000000000000002
4

5 に答える 5

158

この投稿から:JavaScriptで浮動小数点数の精度を処理する方法は?

いくつかのオプションがあります。

  • 10進数には、 decimal.jsなどの特別なデータ型を使用します
  • 次のように、結果を有効数字の固定数にフォーマットします。 (Math.floor(y/x) * x).toFixed(2)
  • すべての数値を整数に変換します
于 2012-07-27T21:14:15.550 に答える
7

あなたはこのようなことをすることができます

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

編集:big.jsを使用する方が良いでしょう。

big.js

任意精度の10進演算用の、小さく、高速で、使いやすいライブラリ。

>> bigX = new Big(x)
>> bigY = new Big(y)
>> bigY.div(bigX).round().times(bigX).toNumber() // => 1.2
于 2012-07-27T21:15:47.313 に答える
5
> 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

あなたはここで完全な説明をチェックすることができます。

于 2014-03-19T14:07:47.880 に答える
2

このリンクをチェックしてください..それは私を大いに助けました。

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

toPrecision(no_of_digits_required)関数はを返すので、必要な精度の小数点に変換するために関数をstring使用することを忘れないでください。parseFloat()

于 2013-04-09T15:01:55.340 に答える
0

このタスクに取り組むには、最初に小数点以下の桁数を見つけx、次にそれに応じて丸めyます。私は使用します:

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

文字列に変換xし、小数点で分割し、右側の部分の長さを見つけて、その長さに基づいてy.toFixed(length)丸める必要があります。y

于 2012-07-27T21:14:16.650 に答える