Ruby 乘以100

Ruby 乘以100,ruby,floating-point,Ruby,Floating Point,有人能给我解释一下为什么: 33.8 * 100 # => 3379.999999999995 但是 浮点数不能精确地表示所有实数,而浮点数运算不能精确地表示真算术运算,这导致了许多令人惊讶的情况 我建议阅读: 您可能希望使用来避免此类问题。您不能用二进制表示0.1,也不能用十进制表示1/3:问题不清楚。你的意思是“为什么答案不同”?这是因为33.8和23.8不同。@duffymo-但33.8和23.8都包含“0.1”,而23.8*100返回“预期”值。为什么?读这篇文章。这就是IEEE

有人能给我解释一下为什么:

33.8 * 100 # => 3379.999999999995
但是


浮点数不能精确地表示所有实数,而浮点数运算不能精确地表示真算术运算,这导致了许多令人惊讶的情况

我建议阅读:


您可能希望使用来避免此类问题。

您不能用二进制表示0.1,也不能用十进制表示1/3:问题不清楚。你的意思是“为什么答案不同”?这是因为
33.8
23.8
不同。@duffymo-但33.8和23.8都包含“0.1”,而23.8*100返回“预期”值。为什么?读这篇文章。这就是IEEE中浮点数的工作原理。虽然你的问题是关于另一个因素,但它更准确地说是这个问题的重复,而不是所选问题的重复,我的答案提供了一些元素来解释为什么一个常量被取整为整数值,而另一个则没有:BigDecimal不能精确地表示1/3。没有帮助。它会为问题中的示例返回正确的数字。斯皮克曼-感谢您的快速回答。还有几个问题:如果浮点数对于简单的算术运算来说非常不准确,那么Float类的意义是什么?还有,有没有一种方法可以预测哪些浮点数会“不准确”,哪些浮点数会返回预期结果,就像23.8*100那样?@Doctore:浮点数比BigDecimal快得多,需要的内存也少,而且通常不需要精确的精度。
23.8 * 100 # => 2380.0