2017-06-16 14 views
0

如果我做了以下內容:的JavaScript解析INT四捨五入問題

parseInt(parseFloat(9.20)*100*1)/100 // returns 9.19 

它返回9.19時,我想它返回9.20做什麼我需要改變,以得到它返回正確的值?

我有同樣的問題,當我將其更改爲:

parseInt(parseFloat(9.12)*100*1)/100 // returns 9.11 

但是,任何其他值正常工作:

parseInt(parseFloat(9.30)*100*1)/100 // returns 9.30 (correct) 

UPDATE:

的解決方案是這樣的:

(Math.round(9.20*100*1)/100).toFixed(2) 
+0

呀,這是不會在上班幾乎任何編程語言(包括JavaScript)。二進制浮點根本無法準確表示某些值。 –

+0

你的代碼沒有意義...爲什麼不是9.12/100 * 100? –

+0

[this](https://www.w3schools.com/js/js_numbers.asp)可能有幫助 –

回答

0

因爲Jav aScript使用二進制算術,浮點數學是基10結果的近似值。

避免這種情況的一種方法是執行積分數學運算,但將您的小數乘以一個足夠大的因子以將它們轉換爲整數,然後再用相同的因子分解回答。

在這種情況下,我不確定您爲什麼使用parseInt()parseFloat(),因爲您首先不使用字符串。

最後,當您使用parseInt()時,建議使用第二個(可選)參數並提供基數(用於執行操作的基數系統),因爲您可以在將字符串轉換爲解析從「0」或「0x」開始。

var result = parseInt(9.2*10, 10)/10 // returns 9.19 
 

 
console.log(result);

1

的問題是,9.20*100在Javascript返回919.9999999999999,而不是920,因爲浮點錯誤。當你做一個parseInt()時,它不會舍入到最接近的整數,而是截斷它到919,這就是爲什麼你的最終答案是錯誤的。

而不是使用parseInt()的,使用更好的方法是Math.round()。此方法將舍入到最接近的整數,將您的919.99999轉換爲920,爲您提供正確的答案。

+0

這似乎已經完成了。我把它改成了'(Math.round(parseFloat(9.20)* 100 * 1)/ 100).toFixed(2)//返回「9.20」'謝謝! – fidler2326

+0

我只想補充一點,在代碼中根本不需要parseFloat(),parseFloat用於將一個字符串,例如'「9.2」'轉換爲浮點'9.2'。由於你的號碼似乎已經是一個浮點數,而不是一個字符串,你應該能夠完全移除'parseFloat()'。我也有點好奇,爲什麼你似乎乘以1? –