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

vd8tlhqk  于 2023-06-22  发布在  Ruby
关注(0)|答案(2)|浏览(115)

我正在学习Ruby,我现在在数字。因此,据我所知,有五种方法(也许更多)可以将整数和浮点数相互强制:

  • Integer#to_f:强制到一个新的float
  • Float#ceil:向上舍入到最接近的整数
  • Float#floor:向下舍入到最接近的整数
  • Float#round:舍入到最接近的整数
  • Float#to_i:截断为最接近的整数

“四舍五入”和“截断”到最接近的整数有什么区别?
当我测试它的时候...

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

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

34
34
cclgggtu

cclgggtu1#

  • floor(无参数)返回小于或等于接收方的下一个整数
  • ceil(无参数)返回下一个大于或等于接收方的整数
  • to_i丢弃接收器的小数部分并返回整数部分

| 关闭|f.to_i| f.floor | f.ceil | f.round |
| - -----|- -----|- -----|- -----|- -----|
| 11.8 |十一|十一|十二岁|十二岁|
| 11.5 |十一|十一|十二岁|十二岁|
| 11.2 |十一|十一|十二岁|十一|
| 11.0 |十一|十一|十一|十一|
| -11.2|-11|- 十二|-11|-11|
| -11.5|-11|- 十二|-11|- 十二|
| -11.8|-11|- 十二|-11|- 十二|
对于正数,to_i的行为类似于floor,对于负数,ceil的行为类似于ceil
实际上,这就是Float#to_inumeric.c中的实现方式:

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);
}

还有truncate,其行为类似于to_i,但采用可选的数字数(如floorceilround)。

hgncfbus

hgncfbus2#

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

-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

相关问题