为什么以下工作在红宝石?

时间:2016-05-17 14:09:45

标签: ruby ruby-on-rails-3 ruby-2.1 ruby-2.2

对于一系列整数,

JOINs在这种情况下表现不同。 最多15位小数,to_a返回include?但是一旦达到16位小数,数组会将十进制数字视为数组的一部分。

  

为什么?

false
  

为什么范围表示这是真的

2.2.1 :020 > (1..9).to_a.include?(8.999999999999999)
 => false 
2.2.1 :021 > (1..9).to_a.include?(8.9999999999999999)
 => true 
2.2.1 :022 >

1 个答案:

答案 0 :(得分:4)

(1..9).include?(8.9)1 <= 8.9 && 8.9 <= 9相同。我认为很明显为什么这会返回true

但是(1..9).to_a会返回数组[1,2,3,4,5,6,7,8,9]。这导致了另一个观察结果:

8.999999999999999 == 9   #=> false
8.9999999999999999 == 9  #=> true

Floating point shenanigans

您可能希望使用next_float来调查下一个可表示的浮点数(正如Tom Lord在评论中指出的那样):

8.999999999999999.next_float   #=> 9.0
8.9999999999999999.next_float  #=> 9.000000000000002

Etvoilà。