Floating point 有人能解释为什么ruby中的19.99*100是1998吗?

Floating point 有人能解释为什么ruby中的19.99*100是1998吗?,floating-point,Floating Point,使用ruby版本2.0.0p247或1.9.3p286 在irb控制台中 9.99 * 100 = 999.0 及 但是 有人能解释一下这是怎么回事吗?我知道这可能是ruby core中的一个bug,但上述3种计算的逻辑肯定是相同的?将ing点数乘以整数的结果 19.99 * 100 事实上: # => 1998.9999999999998 由于使用64位双精度浮点来存储数字,因此它是。但是,您可以获得标准化浮点: puts "%.1f" % (19.99 * 100) # =&g

使用ruby版本2.0.0p247或1.9.3p286

在irb控制台中

9.99  * 100 = 999.0

但是


有人能解释一下这是怎么回事吗?我知道这可能是ruby core中的一个bug,但上述3种计算的逻辑肯定是相同的?

将ing点数乘以
整数的结果

19.99 * 100
事实上:

# => 1998.9999999999998
由于使用64位双精度浮点来存储数字,因此它是。但是,您可以获得标准化浮点:

puts "%.1f" % (19.99 * 100)
# => 1999.0
直接从ruby:

浮点对象使用本机函数表示不精确的实数 体系结构的双精度浮点表示

浮点数有不同的算法,是一个不精确的数字。所以 你应该知道它的秘密系统。见下文:


Ruby教程核心中的示例

Example of odd behavior:

>> (2.0-1.1) == 0.9
=> false

要回答这个具体问题:

但上述3种计算的逻辑肯定是相同的吗


是的。但存储的值不是您在控制台中作为
浮点值输入的十进制表示形式的直接副本。相反,它被转换为内部形式。要了解发生了什么,您需要查看用于存储正在操作的值的内部二进制表示。然后您将看到它是100%一致的,但不是100%精确的。

为了正确计算,请确保使用BigDecimal数据类型,这对于金融数据尤其重要

19.99.to_d * 100.0.to_d

因为浮点数学(在任何语言中,不仅仅是Ruby)。Ruby是否与数据类型一起工作,如果是的话,值的数据类型是什么?Ruby支持rational算术,但您必须要求它。
Example of odd behavior:

>> (2.0-1.1) == 0.9
=> false
19.99.to_d * 100.0.to_d