Ruby的.ceil和.floor

33

我是Ruby的新手,正在尝试弄清楚ceilfloor的工作原理,因为当使用分数或小数时(类似的值)会得到不同的答案。以下是我尝试过的:

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应该返回一个更高的数字,而floor则是一个更低的数字。希望有人能为我解惑。谢谢!:)

1个回答

51

一切都被正确地返回了。

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

为了更好地理解,您可以将结果转换为浮点数:

(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


4
值得一提的是,8/3.floor 实际上是 8/(3.floor),因为 . 的优先级高于 / - tadman
好的!所以第一行实际上先执行了3.ceil,结果为3,然后进行8/3的整数除法,这就是为什么它是2(true),而不像第三行那样是3(false)。如果我错了,请纠正我 :) - misokuan
@misokuan “实际上是先执行3.ceil,得到3,然后进行8/3的整数除法,这就是为什么结果是2”的解释是正确的。 - Andrey Deineko
1
还有 fdiv 方法可以执行浮点数除法,例如 8.fdiv(3).ceil。Ruby 还提供了一个很好的Rational 类:(8/3r).ceil - Stefan
运算符优先级总是讲述神秘计算的故事。 :) - JeffK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接