2012-04-25 8 views
3

javascriptで区切りで丸めの問題が発生する可能性がありますが、乗算では問題があることは知っていました。どのようにそれらを解決するのですか?javascript、数字の丸めの問題

var p = $('input[name="productsUS"]').val().replace(",", "."); 
var t = $('input[name="productsWorld"]').val().replace(",", "."); 

if (p >= 0 && t >= 1) { 
    var r = p/t; 
    r = Math.round(r * 10000)/10000; 
    var aff = (r * 100) + "%"; 

p = 100場合とt = 57674

r = 0.0017(OK)とaff = 0.16999999999999998%(引数)

どのように私はaff = 0.17を得ることができましたか?

+0

http://stackoverflow.com/questions/1458633/elegant-workaround-for-javascript-floating-point-number-problem – Romhein

+0

まだ問題がありますか? – gdoron

+0

Nop、toFixed()が解決策でした。私はちょうど答えを出して1つを選ぶ時間を人々に与えました。 – Kraz

答えて

1
var aff = (r * 100).toFixed(2) + "%"; 

Live DEMO

toFixedビットバギー(バイナリ!)。この問題を回避する唯一の方法は、小数点以下2桁まで四捨五入することです。そのよう単項+演算子を使用してあなたの代わりに文字列に変換されるの数を維持するaffにしたい場合は

2

("0.16999999999999998").tofixed(2)0.17です。それがされて非整数を格納方法が原因のJavaScriptのバグ(それはまた、Pythonなど、いくつかの他の言語に影響が)、だMDN

0

+0

おそらく小数点以下2桁を意味しています... – gdoron

+0

うん、それを修正しました。 – callumacrae

+0

これはバグではなく、それは限界です... – Kraz

1

、あなたは精度の問題を回避するためにtoFixedを使用することができ、その後、数に戻すことを「キャスト」:

var n = 0.16999999999999998; 

n = +n.toFixed(10); // 0.17 

おそらく、私がここで10を使用し、丸めの問題を回避するために、小数点以下2桁よりも高い精度を使用します。