2012-04-25 40 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 = 100t = 57674

r = 0.0017(OK)和aff = 0.16999999999999998%(ARG)

我怎麼能獲得aff = 0.17

+0

http://stackoverflow.com/questions/1458633/elegant-workaround-for-javascript-floating-point-number-problem – Romhein 2012-04-25 14:27:35

+0

你還有問題嗎? – gdoron 2012-04-25 15:10:57

+0

Nop,toFixed()是解決方案。我只是給了人們一些時間來提出答案並挑選一個答案。 – Kraz 2012-04-25 16:40:30

回答

2

("0.16999999999999998").tofixed(2)給你0.17

0

這是在JavaScript中的錯誤(雖然它也影響到其他一些語言,比如Python),由於它的方式存儲非整數是toFixed有點兒車(二進制!)。解決它的唯一方法是將其舍入到小數點後兩位。

+0

你可能意思是兩位小數...... – gdoron 2012-04-25 14:32:51

+0

是的,修正了這個問題。 – callumacrae 2012-04-25 14:34:09

+0

這不是一個錯誤,它是一個限制... – Kraz 2012-04-25 18:00:23

1

如果你想aff仍然是一個號碼,而不是被轉換爲字符串,可以使用toFixed解決精度問題,然後「投」回了一些使用一元+運營商,像這樣:

var n = 0.16999999999999998; 

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

您可能想要使用比2位小數更高的精度來避免舍入問題,我在這裏使用了10。