前の言葉で書かれています:
今日、私は同僚が問題を解決するのを手伝いました。つまり、小数を掛けるときに現れる多くの小数の場所があるということです。私は以前にこの問題に遭遇したことがあるので、具体的に要約します。
数字タイプ:
数値タイプは、ECMAScriptで最も一般的に使用され、最も興味深いタイプです。このタイプでは、IEEE754形式を使用して整数と浮動小数点値を表します(フローティングポイント値も、一部の言語では二重精度値です)。さまざまなデータ型をサポートするために、ECMA-262は異なる数値表面形式を定義します。
小数:
var intnum = 10; //整数
Octal:
var octalnum1 = 070; //オクタル56
var octalnum2 = 079; // 79として無効なoctal値分解
厳密なモードでは、オクタルリテラルが無効です。
ヘキサデシマル:
var hexnum1 = 0xa; // 10
覚えておいてください:操作を実行するとき、Octalおよび16進数で表されるすべての値は最終的に10進数に変換されます。
小数の動作にエラーがあるのはなぜですか?
浮動小数点値の最大の進歩は17桁の小数ですが、その精度は操作を実行する際の整数の精度よりもはるかに少ないです。整数は、操作を実行するときに小数に変換されます。また、JavaおよびJavaScriptの小数操作を計算する場合、10進数は最初に対応するバイナリに変換され、いくつかの10進数をバイナリに完全に変換することはできないため、最初のエラーがここで発生します。すべての小数がバイナリに変換された後、バイナリ操作が実行されてバイナリ結果が得られます。次に、バイナリ結果を小数に変換し、通常は2番目のエラーがここで発生します。
したがって、(0.1+0.2)!= 03
解決:
プログラムコード
正確な分割結果を得るための分割関数
注:javaScriptの分割結果にエラーが発生します。これは、2つの浮動小数点数を分割する場合、より明白になります。この関数は、より正確な分割結果を返します。
通話:accdiv(arg1、arg2)
戻り値:arg1の正確な結果をarg2で割った
関数accdiv(arg1、arg2){var t1 = 0、t2 = 0、r1、r2; try {t1 = arg1.tostring()。split( "。")[1] .length} catch(e){} try {t2 = arg2.toString()。split( " r2 = number(arg2.toString()。置換( "。"、 "))return(r1/r2)*pow(10、t2-t1);}}}divメソッドを数値タイプに追加する方が便利です。
number.prototype.div = function(arg){return accdiv(this、arg); }乗算関数正確な乗算結果を得る
注:JavaScriptの乗算結果にはエラーが発生します。これは、2つのフローティングポイント番号を掛けると、より明白になります。この関数は、より正確な乗算結果を返します。
通話:accmul(arg1、arg2)
返品値:Arg1の正確な結果にarg2を掛けた
関数accmul(arg1、arg2){var m = 0、s1 = arg1.tostring()、s2 = arg2.tostring(); {m+= s1.split( "。")[1] .length} catch(e){} try {m+= s2.split( "。"。 ")[1] .length} catch(e){} return number(s1.replace("。 "、"))*number数値タイプにMULメソッドを追加すると、呼び出す方が便利です。
number.prototype.mul = function(arg){return accmul(arg、this);}正確な追加結果を得るための追加関数
注:JavaScriptの追加結果にエラーが発生します。これは、2つの浮動小数点数を追加するとより明白になります。この関数は、より正確な追加結果を返します。
通話:accadd(arg1、arg2)
戻り値:Arg1 Plus Arg2の正確な結果
function acadd(arg1、arg2){var r1、r2、m; {r1 = arg1.tostring()。split( "。")[1] .length} catch(e){r1 = 0} try {r2 = arg2.tostring() (arg1*m+arg2*m)/m}番号タイプに追加メソッドを追加して、呼び出しがより便利になります。
number.prototype.add = function(arg){return accadd(arg、this);}これらの関数を使用する場所に含め、それを呼び出して計算します。
たとえば、計算する場合は:7*0.8、(7).mul(8)に変更します。
他の操作は同様であり、より正確な結果を得ることができます。
解決策2:
より一般的に使用されるメソッド、tofixed()およびtofixed()メソッドは、指定された10進数で数値を数値に丸めます。計算結果の後にこの方法を追加することは問題ありません。しかし、それは精度にわずかな影響を与えます。精度要件が高くない場合は、使用することをお勧めします。