2015-09-14 103 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