-1
var quantity = $(this).find('td:eq(2) input').val()*1;
var unitprice = $(this).find('td:eq(3) input').val()*1;
var totaltax = 0;
$(this).find('td:eq(4) input[name^=taxamount]').each(function(){
    totaltax = (totaltax*1)+($(this).val()*1);
});
var subtotal = (unitprice+totaltax);
alert(subtotal+' is unit subtotal, to mulitply by '+quantity);
var total = subtotal*quantity;
$(this).find('td:last').html('$'+total);

この場合、私のDOMに基づくと、結果はすべて整数になります(特に、値に* 1修飾子を適用して、値が文字列ではなく数値であることを確認しているため)。

この場合、これらは上記のコードの最初の7行以内に返される値です(アラートコマンドで確認されます)。数量:10単価:29合計税:3.48小計= 32.48

合計変数の小計*数量を乗算すると、合計は次のようになります。合計:324.79999999999995

したがって、最後に、td:lastが$324.80ではなく$324.79999999999995で埋められるようになります。これは、より正確です。

奇妙な、私は知っています。エラーなどがないことを確認するために、さまざまなポイントであらゆる種類のアラートを試しました。

4

7 に答える 7

7

これは1億回も聞かれています。

読んでください:すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと

于 2011-08-09T22:17:10.173 に答える
4

浮動小数点値に関するおなじみの問題に直面しています。特定の値は、有限の2進浮動小数点数で正確に表すことができません。

ここを参照してください:

JavaScriptで浮動小数点数の精度を処理するにはどうすればよいですか?

于 2011-08-09T22:18:50.897 に答える
3

これは、浮動小数点数が機能する方法です。ここでは奇妙なことは何も起こっていません。

表示のために値を適切に丸めることをお勧めします。

于 2011-08-09T22:17:52.727 に答える
1

これが浮動小数点演算の喜びです。基数10の小数の一部は2進数で表すことができません。

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

于 2011-08-09T22:19:05.003 に答える
1

実際の数学では、たとえば 0.01 から 0.02 の間に文字通り無限の数の値があるため、コンピューターは 2 進数で 10 進数をうまく処理できません。そのため、近似値を格納する必要があり、これらの近似値で算術演算を行うと、結果が真の結果から少し離れてしまう可能性があります。

あなたはそれを修正することができます(Math.round(total*100)/100).toFixed(2);

于 2011-08-09T22:24:07.320 に答える
1

他の人が述べたように、これは本来の動作方法です。推奨される回避策を以下に示します。

var v = "324.32999999999995";

function roundFloat(n, d) {             
    var a= Math.pow(10, d);             
    var b= Math.round(n * a) / a;
    return b;         
}

$("body").append(roundFloat(v,3));

Wherevは目的の値に置き換えられます。

実例はhttp://jsfiddle.net/QZXhc/で見ることができます。

于 2011-08-09T22:27:11.367 に答える
0

回避策として、小数点以下2桁に丸めてみてください。

于 2011-08-09T22:19:09.077 に答える