ホームページ  >  記事  >  ウェブフロントエンド  >  Javascript浮動小数点演算精度問題の分析と解決_JavaScriptスキル

Javascript浮動小数点演算精度問題の分析と解決_JavaScriptスキル

WBOY
WBOYオリジナル
2016-05-16 16:54:221224ブラウズ

分析

JavaScript には Number という数値型が 1 つだけあり、JavaScript のすべての数値は IEEE-754 標準形式で表されます。 浮動小数点数の精度の問題は JavaScript に固有のものではありません。これは、一部の小数は 2 進数で表すと桁数が無限になるためです。

10 進法 0.0100 1100 1100 1100 ...
0.4 0.0110 0110 0110 0110 ...
0.5 0.1
0.6 0.1001 1001 1001 1001 ...

たとえば 1.1 の場合、プログラムは実際には「1.1」を表現できませんが、ある程度の精度しか達成できません。これは避けられない精度の損失です。

1.09999999999999999

JavaScript では問題はさらに複雑です。ここでは Chrome でのテスト データをいくつか示します。

入力

1.0-0.9 == 0.1 False

1.0-0.8 == 0.2 False

1.0-0.7 == 0.3 False
1.0-0.6 == 0.4 True
1.0- 0.5 == 0.5 真
1.0-0.4 == 0.6 真
1.0-0.3 == 0.7 真
1.0-0.2 == 0.8 真
1.0-0.1 == 0.9 真

解決策

では、この種の 1.0-0.9 != 0.1 のバグ以外の問題を回避するにはどうすればよいでしょうか?以下は一般的に使用される解決策です。精度削減プロセスは常に自動的に丸められるため、浮動小数点演算の結果を判断する前に計算結果の精度が削減されます。 code

コードは次のとおりです:





コードをコピーします

コードは次のとおりです:

// isEqual ツールメソッドを使用すると、値は等しくなります。メソッドfunction isEqual(number1,number2,digits){digits =digits == unnamed? // デフォルトの精度は 10returnnumber1; .toFixed(数字) ===number2.toFixed(数字);} isEqual(1.0-0.7, 0.3) // true を返します
// ネイティブ拡張メソッド。オブジェクト指向スタイルを優先します。
Number.prototype.isEqual = function(number, Digits){
数字 = 数字 == 未定義? // デフォルトの精度は次のとおりです。 10
return this.toFixed(数字) === 数値.toFixed(数字);
}
(1.0-0.7).isEqual(0.3) // true を返します

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