使用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