2016-10-11 7 views
6

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

puts 8/3.ceil == 2 
puts 8/3.floor == 2 
puts 2.67.ceil == 2 
puts 2.67.floor == 2 

Результаты:

true 
true 
false 
true 

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

ответ

12

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

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 true :) 

Чтобы сделать вещи больше смысла здесь, вы можете преобразовать результаты 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.

+3

Также стоит упомянуть '8/3.floor' на самом деле' 8/(3.floor) ', так как' .' связывает сильнее, чем '/'. – tadman

+0

@tadman thx для приятной точки, отредактировал naswer –

+0

Ahh alright! Итак, для первой строки это фактически делает 3.ceil сначала, в результате получается 3, а затем целочисленное деление 8/3, поэтому это 2 (true) вместо 3 (false), как 3-я строка. Исправьте меня, если я ошибаюсь :) – misokuan

2

может быть, вы shoue использовать

(8.to_f/3).ceil == 2 
+1

и точкой ответа, содержащей часть уже данного есть? .. :) –