web-dev-qa-db-fra.com

Ruby .ceil et .floor

Je suis nouveau sur Ruby et j'essaie de comprendre comment ceil et floor fonctionne car j'obtiens des réponses différentes lorsqu'une fraction ou un nombre décimal est utilisé (valeur similaire). Voici ce que j'ai essayé:

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

D'après ma compréhension, ceil devrait renvoyer un nombre supérieur et floor est un nombre inférieur. J'espère que quelqu'un pourra m'éclairer à ce sujet. Merci! :)

22
misokuan

Tout est retourné correctement.

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

Pour donner plus de sens ici, vous pouvez convertir les résultats en flottant:

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

Une autre chose à garder à l'esprit, qu'avoir écrit 8/3.ceil Est en fait 8 / (3.ceil), parce que . Se lie plus fort que /. (thx @ tadman )

Encore une autre chose à mentionner, c'est que (thx @ Stefan ):

Il y a aussi fdiv pour effectuer une division en virgule flottante, c'est-à-dire 8.fdiv(3).ceil. Et Ruby est également livré avec une classe Nice Rational : (8/3r).ceil.

35
Andrey Deineko