ホームページ > 記事 > ウェブフロントエンド > Javascript の計算エラーを修正するための解決策
この記事では主に Javascript の計算エラー (バンカーの四捨五入手法に依存する欠点) の解決策を紹介します。困っている友人は参考にしてください。会社のプロジェクト 浮動小数点価格計算モジュールが多数あり、それが私の中で次のような考えを引き起こしました。上記の問題を解決するために、toFixed メソッドが使用されましたが、エラーが発生しました。小数点以下 5 で終わる浮動小数点数の丸め誤差の問題
console.log(.1+.2); 0.30000000000000004これを出発点として、一連の探索を開始しました。 toFixed で、ようやく役に立つ情報を見つけました。 toFixed で使用される計算ルールは次のとおりです。 バンカーの四捨五入: いわゆるバンカーの四捨五入方法は、基本的に偶数四捨五入 (四捨五入 5 とも呼ばれます) です。放置偶数)方式。
簡単に言うと、5に四捨五入することを検討してください。5の後の数値がゼロでない場合は、1を追加します。5の後の数値がゼロの場合は、奇数か偶数かを調べ、5の前の数値が偶数の場合は、破棄され、5 より前の数値が奇数の場合は 1 で丸められます。
テキスト
ここで、このいわゆるバンカーの丸め方法を検証します。検証は、toFixed を確認するための丸めビットとして 4、5、および 6 を使用して 3 つの状況に分けられます (例として chrome を使用します)。
四捨五入の桁として 4 を使用します:
var num = 0.045; console.log(num.toFixed(2)); 0.044 の終わりのこの状況では、toFixed は非常に良好にパフォーマンスし、エラーの問題はありません。
四捨五入の桁として 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は 6 で終わります。この場合、toFixed も良好にパフォーマンスし、エラーの問題はありません。
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の後にゼロ以外の場合は1が進みます。問題。
四捨五入の桁として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 サイトの他の関連記事を参照してください。