6

乗算したい値を引き出すと、それらは文字列になります。そこで、それらを引き出して、浮動小数点数として解析し (小数点以下の桁数を維持するため)、乗算します。

LineTaxRate = parseFloat(myRate) * parseFloat(myQuantity) * parseFloat(myTaxRateRound);

これで請求書の 99% はうまくいきましたが、非常に奇妙な問題が 1 つ見つかりました。

掛けた場合:78×7×0.0725

Javascript が返されます: 39.584999999999994

通常、電卓で計算すると、39.585になります。

すべてが完了したら、その数値を取得し、.toFixed(2)を使用して丸めます。

Javascript がその数値を返すため、 $39.59の目的の値に丸められません。

合計でMath.round()を試しましたが、それでも同じ数値が得られます。

数値を小数点以下 3 桁から 2 桁に四捨五入することを考えましたが、それはハッキーに思えます。

私はどこでも検索しましたが、parseFloatが精度を失い、.toFixedを使用すると人々が言及しているだけですが、上記の例では役に立ちません。

問題を再現するために作成したテストスクリプトは次のとおりです。

<script>
var num1 = parseFloat("78");
var num2 = parseFloat("7");
var num3 = parseFloat("0.0725");
var myTotal = num1 * num2 * num3;
var result = Math.round(myTotal*100)/100

alert(myTotal);
alert(myTotal.toFixed(2));
alert(result);
</script>
4

3 に答える 3

6

浮動小数点は、10 進数ではなく 2 進数で表されます。一部の 10 進数は正確に表現されません。残念ながら、Javascript には Number クラスが 1 つしかないため、この作業にはあまり適したツールではありません。他の言語には、この種のエラーを正確に回避するように設計された適切な 10 進ライブラリがあります。1セントのエラーを受け入れるか、サーバー側でソリューションを実装するか、これを修正するために一生懸命働く必要があります.

編集:ああ!78 * 7 * 725 を実行してから 10000 で割るか、さらに正確にするには、小数点を適切な場所に置くだけです。基本的に、税率はごく一部以外のものとして表します。あまり便利ではありませんが、おそらく乗算エラーを処理します。

于 2011-09-13T18:18:00.093 に答える