Ruby 中的 Float#floor 和 Float#to_i 有什么区别?

What's the difference between Float#floor and Float#to_i in Ruby?

提问人:Safwan Samsudeen 提问时间:6/5/2023 更新时间:6/5/2023 访问量:124

问:

我正在学习 Ruby,目前我的数量很多。因此,据我了解,有五种方法(也许更多)可以相互强制整数和浮点数:

  • Integer#to_f:胁迫到新的浮动
  • Float#ceil:四舍五入到最接近的整数
  • Float#floor:向下舍入到最接近的整数
  • Float#round:四舍五入到最接近的整数
  • Float#to_i:截断到最接近的整数

“向下舍入”和“截断”到最接近的整数有什么区别?

当我测试它时...

puts 34.4.to_i()
puts 34.4.floor()

...它产生了相同的值:

34
34
Ruby 浮点

评论


答:

5赞 spickermann 6/5/2023 #1

不同之处在于,基本上只从浮点数中删除小数。while 向下舍入到下一个较低的整数。在处理负浮点数时,差异更容易看出:to_ifloat

-34.4.floor
#=> -35

-34.4.to_i
#=> -34

值得一提的是,Float#round 支持不同的舍入模式。

`:up` or `nil`: round away from zero:

2.5.round(half: :up)      # => 3
3.5.round(half: :up)      # => 4
(-2.5).round(half: :up)   # => -3

`:down`: round toward zero:

2.5.round(half: :down)    # => 2
3.5.round(half: :down)    # => 3
(-2.5).round(half: :down) # => -2

`:even`: round toward the candidate whose last nonzero digit is even:

2.5.round(half: :even)    # => 2
3.5.round(half: :even)    # => 4
(-2.5).round(half: :even) # => -2

评论

0赞 Safwan Samsudeen 6/5/2023
现在有意义了,谢谢!
6赞 Stefan 6/5/2023 #2
  • floor(不带参数)返回小于或等于接收方的下一个整数
  • ceil(不带参数)返回大于或等于接收器的下一个整数
  • to_i丢弃接收器的小数部分并返回整数部分
f f.to_i F.地板 F.塞伊尔 f.圆形
11.8 11 11 12 12
11.5 11 11 12 12
11.2 11 11 12 11
11.0 11 11 11 11
-11.2 -11 -12 -11 -11
-11.5 -11 -12 -11 -12
-11.8 -11 -12 -11 -12

to_i行为类似于正数和负数。floorceil

事实上,这实际上是在 numeric.c 中实现的:Float#to_i

static VALUE
flo_to_i(VALUE num)
{
    double f = RFLOAT_VALUE(num);

    if (f > 0.0) f = floor(f);
    if (f < 0.0) f = ceil(f);

    return dbl2ival(f);
}

还有截断,其行为类似于,但采用可选的数字数(如、和)。to_ifloorceilround

评论

0赞 Safwan Samsudeen 6/5/2023
我希望我能接受两个正确的答案,但非常感谢你的回答!
0赞 aka.nice 6/6/2023
也许您可以在表格中添加 10.5 和 -10.5,以记录在完全平局的情况下是四舍五入到最接近的偶数还是远离零......