2017-06-30 33 views
2

我有一個利率計算一個討厭的錯誤:我有圓的答案最接近的分,但四捨五入的數爲2位小數失敗

interest = Math.round(interest * 100)/100; 

刪除整個小數部分。 interestdouble類型。爲什麼是這樣?等效的代碼在C++中工作正常。

+4

真正的錯誤是你正在使用浮點錢。永遠不要這樣做。使用'BigDecimal'。 – EJP

+0

我看了一下這個副本,但是做一個舍入真的很複雜嗎? –

+0

出於興趣,C++中的等效代碼是什麼?我們有:: floor和:: ceil,但不是「開箱即用」的德國舍入功能。 – Bathsheba

回答

3

讓我們暫時放下一個潛在的更大問題,那就是對於需要精確十進制表示的數量使用二進制浮點。

Java bods打破了傳統,並決定Math.round(interest * 100)應返回long,而不是double。 (我想他們這樣做了,因爲任何不是整數的double都會四捨五入到一個整數,可以適應long類型)。所以表達式

Math.round(interest * 100)/100 

在整數運算中被評估,所以任何餘數都被丟棄。在我看來最明顯的解決方法是寫

interest = Math.round(interest * 100)/100.0; 

這迫使評估發生在浮點。

還要注意,即使在應用該舍入之後,結果的底層浮點值通常也會在第二個小數位後超過非零數字:double僅給出15位十進制有效數字的精度。

+0

謝謝。我希望這會是這樣簡單的事情! –

+3

高興。但請注意使用'double'作爲貨幣價值的注意事項。 – Bathsheba

+1

它可能會強制評估浮點數,但它也不能將數字四捨五入到小數點後兩位。 – EJP