ホームページ >ウェブフロントエンド >jsチュートリアル >数値計算の精度誤差を回避するためのJavaScriptメソッドを詳しく解説_JavaScriptスキル
0.1 0.2 とは何ですか?きょとんとした顔をされるかも知れませんが、 0.1 0.2 = 0.3 ああ、まだ聞きますか?このような小児科の質問には幼稚園児でも答えることができます。しかし、ご存知のように、プログラミング言語における同じ問題は、想像されているほど単純ではない可能性があります。
信じられませんか?まず JS の一部を見てみましょう。
var numA = 0.1;
var numB = 0.2;
alert( (numA numB) === 0.3 );
var numA = 0.1;
var numB = 0.2;
結局、0.1 0.2 = 0.30000000000000004 となります。おかしくないですか?実際、浮動小数点数の四則演算については、ほぼすべてのプログラミング言語で同様の精度誤差の問題が発生しますが、C/C#/Java などの言語では、精度の問題を回避するためにメソッドがカプセル化されており、JavaScriptこの言語は設計コンセプトから浮動小数点数に対する厳密なデータ型を持たないため、精度誤差の問題が特に顕著です。この精度エラーが発生する理由とその修正方法を分析してみましょう。
0.1 => 0.0001 1001 1001 1001… (無限ループ)
0.2 => 0.0011 0011 0011 0011… (無限ループ)
倍精度浮動小数点数の小数部分は最大 52 桁をサポートするため、これら 2 つを加算すると、浮動小数点数の小数点以下の桁数の制限により切り捨てられる 0.0100110011001100110011001100110011001100110011001100 という文字列が得られます。このとき、10進数に変換すると、0.30000000000000004となります。
最も簡単な解決策は、値を返すプロセス中に、次のような明確な精度要件を指定することです。
var numA = 0.1;
var numB = 0.2;
alert(parseFloat((numA numB).toFixed(2)) === 0.3 );しかし、明らかに、これは一度限りの方法ではありません。これらの浮動小数点数の精度の問題を解決できる方法があれば素晴らしいでしょう。この方法を試してみましょう:
Math.formatFloat = function(f, digit) {
return parseInt(f * m, 10) / m; >
var numA = 0.1;var numB = 0.2;
alert(Math.formatFloat(numA numB, 1) === 0.3);
この方法はどういう意味ですか?精度の差を避けるためには、計算する数値に10のn乗を掛け、コンピュータが正確に認識できる整数に変換してから、10のn乗で割る必要があります。プログラミング言語は精度の違いを処理します。これを使用して、JS の浮動小数点数の精度エラーを処理します。
今度誰かが 0.1 0.2 とは何かと尋ねたら、答え方に注意する必要があります。 !