2012-05-26 19 views
5

我使用toFixed時遇到的舍入誤差:toFixed(2)rounds「x.525」inconsistently?

我在我的數值計算中使用toFixed(2),但是舍入結果並不如預期的少數病例。

假設toFixed(2)適用於價值17.525然後給出結果17.52,而如果它用於5.525然後給出結果5.53

在後面的情況下,舍入結果是準確的,所以請您建議需要做些什麼來獲得準確的舍入結果,如後面的情況。或者你能否建議一個替代這個toFixed函數來獲得正確的舍入結果?

+1

僅供參考,這有什麼好做的jQuery。這是一個JavaScript函數https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/toFixed。 – alexn

+2

這個結果非常好。尾數指數浮點數是一個謊言。嘗試'toFixed(20)'然後比較。 – 2012-05-26 16:59:52

+0

[Using toFixed(2)and math round to get correct rounding](http://stackoverflow.com/questions/2861055/using-tofixed2-and-math-round-to-get-correct-rounding) – 2012-05-26 17:01:10

回答

4

浮點不精確意味着結束0.525大多數數字實際上.52500..1,其餘爲0.5249999 .....

哪種方式的價值輪取決於是否在IEEE最接近實際表現-754浮點數高於或低於所需值。

+2

那麼是否有一種很好的方法來進行n對齊呢? – 2012-05-26 17:20:03

+0

'17.525.toFixed(3)' '「17.525」'丟掉最後一位數字給出'「17.52」'這是錯誤的?儘管我在不同的瀏覽器中得到了不同的結果,所以我懷疑'toFixed'是否有好處:P – Esailija

+0

@Esailija不,我認爲17.52在這種情況下是有效的答案。 – Alnitak

1

將數字轉換爲字符串並使用它?

這是我嘗試使用Math.round或Math.ceil模擬最近舍入後的最後一招,但失敗了。當乘以100時,某些數字(如17.525)會比其值(1752.5)的100倍少一些,而其他數字(如17.545)會比其值(1754.5)的100倍多一點。

+0

我不完全確定如何將數字轉換爲字符串會有所幫助......只是看起來更多的工作。 – 2012-05-26 17:22:23

+0

我們將使用十進制表示而不是數字的二進制表示。當我們在舍入之前和之後打印值時,它是「視覺上正確的」。 – nhahtdh

3

代替toFixed()使用Math.ceil()Math.floor()Math.round()

一個辦法像

var rnum = 5.525, 
    decimalPlaces = 2, 
    factor = Math.pow(10, decimalPlaces), 
    newnumber = Math.round(rnum * factor)/factor, 
    mydecimalvalue = parseFloat(newnumber); 

結果周圍是5.53

+0

但是,這些返回整數值......這裏如何使用它? – 2012-05-26 17:20:56

+0

是的,但該鏈接是關於'toFixed(0)',而不是'toFixed(2)'... – 2012-05-26 17:23:19

+0

將數字乘以100後,數字已經失去了精度,因此使用這些方法並不能真正幫助。 – nhahtdh