2015-09-14 101 views
-2

有人能向我解釋爲什麼:乘以100

33.8 * 100 # => 3379.999999999995 

23.8 * 100 # => 2380.0 
+2

你不能再更準確地表示0.1的二進制比你可以1/3的十進制:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – duffymo

+0

問題不明確。你的意思是「爲什麼答案不同」?這是因爲'33.8'和'23.8'是不同的。 – sawa

+0

@duffymo - 但33.8和23.8都包含「0.1」,但23.8 * 100返回「期望」值。爲什麼? – Doctore

回答

4

浮點數不能精確代表所有實數,浮點運算不能精確代表真正的算術運算這導致了許多令人驚訝的情況。

我建議改爲:https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

您可能需要使用BigDecimal避免這樣的問題。

+0

BigDecimal不會完全代表1/3。沒有幫助。 – duffymo

+1

它會返回問題中示例的正確數字。 – spickermann

+0

spickerman - 感謝您的快速回答。還有幾個問題:如果浮點數對於簡單的算術運算非常不準確,那麼Float類有什麼意義?另外,有沒有辦法預測哪些浮動數字「不準確」,並且會返回預期結果,如23.8 * 100所做的那樣? – Doctore