Ruby floor给出的小数点不正确



使用floor和params作为小数位数,遇到一些奇怪的输出。

100.1111.floor(1)
=> 100.1
100.1111.floor(2)
=> 100.11
100.1111.floor(3)
=> 100.111
100.1111.floor(4)
=> 100.111 # why is this even the correct answer
100.1111.floor(5)
=> 100.1111

为什么floor(4)只返回小数点后3位,为什么floor(5)会给出正确的响应?

我试图看看这是否是一个错误,所以我尝试了一个不同的浮动。

100.111111.floor(1)
=> 100.1
100.111111.floor(2)
=> 100.11
100.111111.floor(3)
=> 100.111
100.111111.floor(4)
=> 100.1111
100.111111.floor(5)
=> 100.11111
100.111111.floor(6)
=> 100.111111

但事实并非如此,因为floor适用于其他浮点数。我尝试了100.111和其他浮动,它们似乎都能工作。似乎只有100.1111给出了这个问题。这是Float#floor实现的问题吗?

Ruby版本是ruby 3.0.3p157(如果有帮助的话(。

浮点数字不能代表每个数字/精度,我建议您尝试最著名的例子0.1 + 0.2,它在大多数语言中都不能代表0.3

如果你真的关心ruby中的精度,请使用BigDecimal

require 'bigdecimal/util'
puts BigDecimal('100.1111').floor(1).to_digits
puts BigDecimal('100.1111').floor(2).to_digits
puts BigDecimal('100.1111').floor(3).to_digits
puts BigDecimal('100.1111').floor(4).to_digits
puts BigDecimal('100.1111').floor(5).to_digits
puts BigDecimal('100.1111').floor(6).to_digits

https://ruby-doc.org/stdlib-3.0.3/libdoc/bigdecimal/rdoc/BigDecimal.html