2016-10-11 13 views
6

Ruby için yeni ve ceil ve floor'un bir kesir veya ondalık sayı kullanıldığında (benzer değer) farklı yanıtlar almayı nasıl çalıştığını anlamaya çalışıyorum. Aşağıda ben denedim budur:Ruby .ceil ve .floor

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

Sonuçlar: Benim anlayış

true 
true 
false 
true 

, ceil bir sayı daha yüksek dönmelidir ve floor bir sayı daha düşüktür. Umarım birisi bu konuda beni aydınlatır. Teşekkür ederim! :)

cevap

12

Her şey doğru şekilde döndürülüyor. . daha güçlü bağlar çünkü

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

Başka bir şey 8/3.ceil aslında 8/(3.ceil) olduğunu yazılı olan o, akılda tutulması:

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

sen Float sonuçları dönüştürebilir, burada daha mantıklı şeyler yapmak /. , fdiv de var

kayan noktalı sayılarda bölme işleminde yani 8.fdiv(3).ceil: (thx @tadman)

söz Yine başka bir şey, (thx @Stefan) olmasıdır. Ve Ruby de güzel bir Rational sınıfı ile birlikte gelir: (8/3r).ceil.

+3

kullanmak shoue' 8/(3.KAT) '' .' '/' daha güçlü bağlar beri. Güzel bir nokta için – tadman

+0

@tadman thx, naser düzenledi –

+0

Ahh tamam! Yani ilk satır için, aslında önce 3.ceil, 3 ile sonuçlanır, ve daha sonra 8/3 bir tamsayı bölüştürür, bu yüzden 3 satır gibi 3 (yanlış) yerine 2 (doğru) olur. Eğer yanılıyorsam beni düzeltin :) – misokuan

2

belki `8/3.floor` aslında kayda değer Ayrıca

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

ve zaten verilen bir parçası? .. :) –