Ruby.ceil и.floor

Я новичок в Ruby, и я пытаюсь понять, как работает ceil и floor когда я получаю разные ответы, когда используется дробь или десятичное число (аналогичное значение). Ниже я попытался:

puts 8/3.ceil == 2   #=> true
puts 8/3.floor == 2  #=> true
puts 2.67.ceil == 2  #=> false
puts 2.67.floor == 2 #=> true

По моему ceil, ceil должен возвращать число выше, а floor - на несколько ниже. Надеюсь, кто-то может просветить меня по этому поводу. Спасибо! :)

Ответ 1

Все возвращается правильно.

puts 8/3.ceil == 2
#=> true, because 8/3 returns an Integer, 2
puts 8/3.floor == 2
#=> true, because 8/3 returns an Integer, 2
puts 2.67.ceil == 2
#=> false, because 2.67.ceil is 3
puts 2.67.floor == 2
#=> true, because 2.67.floor is 2

Чтобы сделать это более понятным, вы можете преобразовать результаты в Float:

(8.to_f / 3).ceil == 2  #=> false
(8.to_f / 3).floor == 2 #=> true
2.67.ceil == 2          #=> false
2.67.floor == 2         #=> true

Еще одна вещь, которую нужно иметь в виду, что написание 8/3.ceil на самом деле 8/(3.ceil), потому что . связывает сильнее, чем /. (спасибо @tadman)

Еще одна вещь, которую стоит упомянуть, это (спасибо @Stefan):

Там также fdiv для выполнения деления с плавающей запятой, т.е. 8.fdiv(3).ceil. И в Ruby также есть класс Rational: (8/3r).ceil.