ホームページ >ウェブフロントエンド >jsチュートリアル >数値計算の精度誤差を回避するためのJavaScriptメソッドを詳しく解説_JavaScriptスキル

数値計算の精度誤差を回避するためのJavaScriptメソッドを詳しく解説_JavaScriptスキル

WBOY
WBOYオリジナル
2016-05-16 16:57:061229ブラウズ

0.1 0.2 とは何ですか?きょとんとした顔をされるかも知れませんが、 0.1 0.2 = 0.3 ああ、まだ聞きますか?このような小児科の質問には幼稚園児でも答えることができます。しかし、ご存知のように、プログラミング言語における同じ問題は、想像されているほど単純ではない可能性があります。
信じられませんか?まず JS の一部を見てみましょう。

var numA = 0.1;
var numB = 0.2;
alert( (numA numB) === 0.3 );

実行結果は false です。はい、初めてこのコードを見たときは、当然のことだと思いましたが、実行結果を見て驚いたのですが、私の開き方が間違っていたのでしょうか?いいえ、いいえ。次のコードをもう一度実行してみましょう。結果が false になる理由がわかります。

var numA = 0.1;

var numB = 0.2;
結局、0.1 0.2 = 0.30000000000000004 となります。おかしくないですか?実際、浮動小数点数の四則演算については、ほぼすべてのプログラミング言語で同様の精度誤差の問題が発生しますが、C/C#/Java などの言語では、精度の問題を回避するためにメソッドがカプセル化されており、JavaScriptこの言語は設計コンセプトから浮動小数点数に対する厳密なデータ型を持たないため、精度誤差の問題が特に顕著です。この精度エラーが発生する理由とその修正方法を分析してみましょう。

まず、0.1 0.2 という一見小児的な問題をコンピューターの観点から考えなければなりません。コンピューターが読み取ることができるのは 10 進数ではなく 2 進数であることはわかっているので、まず 0.1 と 0.2 を 2 進数に変換して見てみましょう:

0.1 => 0.0001 1001 1001 1001… (無限ループ)

0.2 => 0.0011 0011 0011 0011… (無限ループ)

倍精度浮動小数点数の小数部分は最大 52 桁をサポートするため、これら 2 つを加算すると、浮動小数点数の小数点以下の桁数の制限により切り捨てられる 0.0100110011001100110011001100110011001100110011001100 という文字列が得られます。このとき、10進数に変換すると、0.30000000000000004となります。

それでは、この問題はどうやって解決すればいいのでしょうか?私が望む結果は 0.1 0.2 === 0.3 ああ! ! !

最も簡単な解決策は、値を返すプロセス中に、次のような明確な精度要件を指定することです。

var numA = 0.1;

var numB = 0.2;

alert(parseFloat((numA numB).toFixed(2)) === 0.3 );

しかし、明らかに、これは一度限りの方法ではありません。これらの浮動小数点数の精度の問題を解決できる方法があれば素晴らしいでしょう。この方法を試してみましょう:

Math.formatFloat = function(f, digit) {

var m = Math.pow(10, 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 とは何かと尋ねたら、答え方に注意する必要があります。 !

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。