Javascript浮動小数点演算精度問題の分析と解決
878 ワード
分析
JavaScriptは一つの数字タイプのNumberだけで、しかもJavascriptの中のすべての数字はIEEE-7054標準形式で表しています。浮動小数点数の精度問題はJavaScript特有のものではなく、一部の小数点はバイナリで桁数を表しているので無限です。
十進数 バイナリ0.1 0.0001 1001 1001…0.2 0.0011 0011 0011…0.3 0.0100 1100…0.4 0.0110 0110 0110…0.5 0.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 True 1.0-0.4==0.6 True 1.0-0.3==0.7 True 1.0-0.2==0.8 True 1.0-0.1==0.9 True
解決
このような1.0-0.9を避けるにはどうすればいいですか?0.1のバグ型でない問題が発生しますか?浮動小数点演算結果を判断する前に、計算結果を精度縮小するために、現在使用されている多くの解決策を示します。精度が縮小される過程では自動四捨五入が行われます。
JavaScriptは一つの数字タイプのNumberだけで、しかもJavascriptの中のすべての数字はIEEE-7054標準形式で表しています。浮動小数点数の精度問題はJavaScript特有のものではなく、一部の小数点はバイナリで桁数を表しているので無限です。
十進数 バイナリ0.1 0.0001 1001 1001…0.2 0.0011 0011 0011…0.3 0.0100 1100…0.4 0.0110 0110 0110…0.5 0.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 True 1.0-0.4==0.6 True 1.0-0.3==0.7 True 1.0-0.2==0.8 True 1.0-0.1==0.9 True
解決
このような1.0-0.9を避けるにはどうすればいいですか?0.1のバグ型でない問題が発生しますか?浮動小数点演算結果を判断する前に、計算結果を精度縮小するために、現在使用されている多くの解決策を示します。精度が縮小される過程では自動四捨五入が行われます。