ホームページ  >  記事  >  ウェブフロントエンド  >  Javascript の計算エラーを修正するための解決策

Javascript の計算エラーを修正するための解決策

黄舟
黄舟オリジナル
2017-08-22 10:40:211880ブラウズ

この記事では主に 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.04

4 の終わりのこの状況では、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を使用する:

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を使用する:

5の後の数字がゼロである: この状況はかなり特殊なので、toFixedメソッドの計算エラーであるため、よく確認し、共通するものを検索しましたメインストリーム ブラウジング デバイスでテスト済み:


次のテスト ケースを例として挙げます:


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.03

0.04
0.04

0.06

0.07
0.07

0.09

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 サイトの他の関連記事を参照してください。

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