浮動小数点乗算、除算が正確に製品価格の計算に関連し、計算することができない遭遇最近のショッピングカートは、しばしば非常に深刻で、開発者のための財務管理システム、JS浮動小数点精度の問題を発生します問題の問題の解決が原因と整頓を関連ところ、(お金関連の問題に関連が深刻な問題となっている)だけでなく、あなたにいくつかの参照を与えたいです。
A.一般的な例
// 追加 0.1 + 0.2 = 0.30000000000000004 0.1 + 0.7 = 0.7999999999999999 0.2 + 0.4 = 0.6000000000000001 // 減算 0.3から0.2 = 0.09999999999999998 1.5から1.2 = 0.30000000000000004 // 乗算 0.8 * 3 = 2.4000000000000004 19.9 * 100 = 1989.9999999999998 // 除算 0.3 / 0.1 = 2.9999999999999996 0.69 / 10 = 0.06899999999999999 // 比較 0.1 0.3 + 0.2 === // falseに - ===(0.1 0.2) - (0.2〜0.3)// falseに
II。原因
ここでは、例えば:( 0.1 + 0.2 = 0.30000000000000004を取るエラー浮動小数点演算の原因を探してください)
まず第一に、我々は、0.1 + 0.2この一見小児科問題を考えて、コンピュータの視点に立っしたいです。私たちは、コンピュータではなく、小数点以下のバイナリを理解することができることを知っているので、我々はバイナリ見た目に0.1と0.2を入れて:
0.1 => 0.0001 100110011001 ...(無限ループ)
0.2 => 001100110011 ... 0.0011(無限ループ)
私たちは、0.1以上0.2は現実の生活の中で、私たちは無限ループを理解することができ、デジタル無限ループの中に、バイナリに変換されますが、コンピュータは無限ループ、小数点のための無限ループを許可されていませんした後、コンピューターがされることがわかりました丸め。支持体52までの倍精度浮動小数点小数部 0.0100 1,100,110,011,001,100 1,100,110,011,001,100 1,100,110,011,001,100を添加した後に得られるように2つのシリーズに、進数を切り捨てにより浮動小数点小数の場所の制限のため、この時、私たちはその後、小数に変換し、それはなり0.30000000000000004
III。ソリューション
乗算Vueの浮動小数点:
Vue.prototype.NumberMul = 関数(ARG1、ARG2){ VAR m = 0です。 VAR S1 = arg1.toString()。 VAR S2 = arg2.toString()。 してみてください{ M + = s1.split( "")[1 ] .LENGTH。 } キャッチ(E){} 試みます{ M + = s2.split( "")[1 ] .LENGTH。 } キャッチ(E){} リターン番号( " "s1.replace( ""))*番号(s2.replace(""、 ""))/ Math.pow(10 、M)。 }
Vueの浮動小数点加算器:
Vue.prototype.NumberAdd = 関数(ARG1、ARG2){ VAR R 1、R 2、M、N。 してみてください{ R1 = arg1.toString()。スプリット( "")[1 ] .LENGTH } キャッチ(E){ R1 = 0 } してみてください{ R2 = arg2.toString()。スプリット( "")[1 ] .LENGTH } キャッチ(E){ R2 = 0 } M = Math.pow(10 、Math.max(R1、R2)) N =(R1> = R2)?R1、R2、 リターン((ARG1 * M + ARG2 * M)/ M)(N)を.toFixed。 }
Vueの浮動小数点減算:
Vue.prototype.NumberSub = 関数(ARG1、ARG2){ VARのRE1、RE2、M、N。 してみてください{ RE1 = arg1.toString()スプリット( "")[1 ] .LENGTH。 } キャッチ(E){ RE1 = 0 ; } してみてください{ RE2 = arg2.toString()スプリット( "")[1 ] .LENGTH。 } キャッチ(E){ RE2 = 0 ; } M = Math.pow(10 、Math.max(RE1、RE2))。 N =(RE1> = RE2)?RE1:RE2。 リターン((ARG1 * M - ARG2 * M)/ M)(N).toFixed。 }
Vueの浮動小数点除算:
// 除数、被除数、保持する小数点以下の桁数 Vue.prototype.NumberDivを= 関数(ARG1、ARG2、用桁){ VARの T1 = 0、T2 = 0 、R1、R2、 トライ {T1 = arg1.toString() .split( " ")[1]} .LENGTH キャッチ(E){} 試み {arg2.toString T2 =()。スプリット("。")[1]} .LENGTH キャッチ(E){} R1 =数(arg1.toString()。交換してください( " """ )) R2 =ナンバー(arg2.toString()。交換してください( ""、 "" )) // 小数点計算後の値を取得 するvar結果を=((R1 / R2)* Math.pow(10、T1-T2))。 toString() VAR結果2 = result.split( "")[1 ]。 結果2 = result2.substring(0、桁> result2.length?result2.length:桁)。 リターン番号(result.split()[0] + + " ""。" 結果2)。 }
使用した単語は、(非常に単純です乗算の計算)
{{NumberMul(0.0058,100)}}
JS場合、それはまた、このように使用することができます。
た NumberMul = 関数(ARG1、ARG2){ た M = 0 。 た S1 = )(arg1.toString。 た S2 = )(arg2.toString。 してみてください{ M + = s1.split( "")[1 ] .LENGTH。 } キャッチ(E){} 試みます{ M + = s2.split( "")[1 ] .LENGTH。 } キャッチ(E){} リターン番号( " "s1.replace( ""))*番号(s2.replace(""、 ""))/ Math.pow(10 、M)。 }
オリジナルリンク:https://blog.csdn.net/m0_37948170/article/details/88237208