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
相关产品推荐
相关产品推荐

