You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby 2.3.1中如何按指定小数位向上/向下取整浮点数

实现指定小数位数的ceil和floor(Ruby 2.3.1)

嘿,我明白你要的功能——在Ruby 2.3.1里给ceil和floor加上指定小数位数的能力,对吧?原生的这两个方法在这个版本里确实只支持取整到整数,不过我们可以自己动手实现这个需求,两种方案供你选:

方案一:扩展Float类(调用更直观)

直接给Float类添加带参数的ceil和floor方法,兼容原生方法的默认行为:

class Float
  def ceil(precision = 0)
    return super() if precision == 0
    multiplier = 10 ** precision
    (self * multiplier).ceil.to_f / multiplier
  end

  def floor(precision = 0)
    return super() if precision == 0
    multiplier = 10 ** precision
    (self * multiplier).floor.to_f / multiplier
  end
end

测试一下:

puts 1.33333333.ceil(2)  # 输出 1.34
puts 1.33333333.floor(3) # 输出 1.333
puts 2.789.floor(1)      # 输出 2.7
puts -1.333.ceil(2)      # 输出 -1.33(负数向上取整逻辑正确)
puts -1.333.floor(2)     # 输出 -1.34(负数向下取整逻辑正确)

原理很简单:把目标数字放大10^precision倍(比如保留2位小数就乘100),调用原生的ceil/floor取整后,再缩小回原来的倍数,就实现了指定小数位数的向上/向下取整。而且当precision为0时,会调用原生方法,保持原有功能不变。

方案二:工具方法(避免修改原生类)

如果你不想修改Float类(担心monkey patch带来的副作用),可以写一个工具模块来封装逻辑:

module NumberUtils
  def self.ceil_with_precision(number, precision)
    multiplier = 10 ** precision
    (number * multiplier).ceil.to_f / multiplier
  end

  def self.floor_with_precision(number, precision)
    multiplier = 10 ** precision
    (number * multiplier).floor.to_f / multiplier
  end
end

使用方式:

puts NumberUtils.ceil_with_precision(1.33333333, 2)  # 输出 1.34
puts NumberUtils.floor_with_precision(1.33333333, 3) # 输出 1.333

两种方案都能完美满足你的需求,选哪种就看你代码的风格偏好啦~

内容的提问来源于stack exchange,提问作者jsmartt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:48:16