この記事では主に Javascript の計算エラー (バンカーの四捨五入手法に依存する欠点) の解決策を紹介します。困っている友人は参考にしてください。会社のプロジェクト 浮動小数点価格計算モジュールが多数あり、それが私の中で次のような考えを引き起こしました。上記の問題を解決するために、toFixed メソッドが使用されましたが、エラーが発生しました。小数点以下 5 で終わる浮動小数点数の丸め誤差の問題
console.log(.1+.2); 0.30000000000000004
簡単に言うと、5に四捨五入することを検討してください。5の後の数値がゼロでない場合は、1を追加します。5の後の数値がゼロの場合は、奇数か偶数かを調べ、5の前の数値が偶数の場合は、破棄され、5 より前の数値が奇数の場合は 1 で丸められます。
テキスト
ここで、このいわゆるバンカーの丸め方法を検証します。検証は、toFixed を確認するための丸めビットとして 4、5、および 6 を使用して 3 つの状況に分けられます (例として chrome を使用します)。
四捨五入の桁として 4 を使用します:
var num = 0.045; console.log(num.toFixed(2)); 0.04
四捨五入の桁として 6 を使用します:
var num = 0.004; console.log(num.toFixed(2)); 0.00 var num = 0.014; console.log(num.toFixed(2)); 0.01 var num = 0.094; console.log(num.toFixed(2)); 0.09
5の後にゼロ以外:
var num = 0.006; console.log(num.toFixed(2)); 0.01 var num = 0.016; console.log(num.toFixed(2)); 0.02 var num = 0.096; console.log(num.toFixed(2)); 0.10
四捨五入の桁として5を使用する:
var num = 0.0051; console.log(num.toFixed(2)); 0.01 var num = 0.0052; console.log(num.toFixed(2)); 0.01 var num = 0.0059; console.log(num.toFixed(2)); 0.01
chrome、firefox、safari、および opera の結果は次のとおりです: 0.01
0.01
0.04
0.04
0.07
0.07
0.10
ie11 結果は次のとおりです:
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.10
それは可能ですIe11では正常ですが、他のブラウザでは表示されるのが間違いです。バンカーの丸め法のルールに完全には準拠していませんが、このルールに完全に準拠していないのは、2 進数の浮動小数点数の落とし穴によるものだと思います。
要するに: toFixed が浮動小数点計算の精度不足の問題を解決するために導入されるか、バンカーの丸め手法を使用するかにかかわらず、すべては精度の問題を解決するためですが、バイナリとは切り離せません。浮動小数点環境ではありましたが、少なくとも彼は私たちが問題を見つけて解決策を見つけるのを手伝ってくれました。
解決策
以下にFixedを書き換えてメソッドを提供します:
var num = 0.005; console.log(num.toFixed(2)); var num = 0.015; console.log(num.toFixed(2)); var num = 0.025; console.log(num.toFixed(2)); var num = 0.035; console.log(num.toFixed(2)); var num = 0.045; console.log(num.toFixed(2)); var num = 0.055; console.log(num.toFixed(2)); var num = 0.065; console.log(num.toFixed(2)); var num = 0.075; console.log(num.toFixed(2)); var num = 0.085; console.log(num.toFixed(2)); var num = 0.095; console.log(num.toFixed(2));
このメソッドの一般的な考え方は、まず丸めビットを見つけて、位置が次より大きいかどうかを判断することです。 5 以上、条件 手動キャリーを 1 ずつ設定し、パラメータ サイズを使用して元の浮動小数点数を 10 パラメータの指数倍に増幅し、フロアを使用して丸めビットを含むすべての桁を削除し、次のいずれかを決定します。以前のマニュアルキャリーに基づいてキャリーします。
以上がJavascript の計算エラーを修正するための解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。