我有一個利率計算一個討厭的錯誤:我有圓的答案最接近的分,但四捨五入的數爲2位小數失敗
interest = Math.round(interest * 100)/100;
刪除整個小數部分。 interest
是double
類型。爲什麼是這樣?等效的代碼在C++中工作正常。
我有一個利率計算一個討厭的錯誤:我有圓的答案最接近的分,但四捨五入的數爲2位小數失敗
interest = Math.round(interest * 100)/100;
刪除整個小數部分。 interest
是double
類型。爲什麼是這樣?等效的代碼在C++中工作正常。
讓我們暫時放下一個潛在的更大問題,那就是對於需要精確十進制表示的數量使用二進制浮點。
Java bods打破了傳統,並決定Math.round(interest * 100)
應返回long
,而不是double
。 (我想他們這樣做了,因爲任何不是整數的double
都會四捨五入到一個整數,可以適應long
類型)。所以表達式
Math.round(interest * 100)/100
在整數運算中被評估,所以任何餘數都被丟棄。在我看來最明顯的解決方法是寫
interest = Math.round(interest * 100)/100.0;
這迫使評估發生在浮點。
還要注意,即使在應用該舍入之後,結果的底層浮點值通常也會在第二個小數位後超過非零數字:double
僅給出15位十進制有效數字的精度。
真正的錯誤是你正在使用浮點錢。永遠不要這樣做。使用'BigDecimal'。 – EJP
我看了一下這個副本,但是做一個舍入真的很複雜嗎? –
出於興趣,C++中的等效代碼是什麼?我們有:: floor和:: ceil,但不是「開箱即用」的德國舍入功能。 – Bathsheba