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

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

WBOY
WBOYオリジナル
2016-05-16 17:24:16986ブラウズ

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.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 までご連絡ください。