我需要将任何浮点数转换为 5 位有效数字格式。它表示前五个非零数字(最后一个数字不向上舍入(。
例
Float("%.#{5}g" % 0.007425742694) => 0.0074257
Float("%.#{5}g" % 3852.574257425742694) => 3852.6
对我来说,这种方法的问题在于 3852.574257425742694 四舍五入为 3852.6,我需要 3852.5。
我知道这些数字是非负数的。可以执行以下操作:
法典
def floor_it(f, sig_digits=5)
pow = sprintf("%e", f)[-3..-1].to_i
(f *= 10**(-pow)).floor(sig_digits-1) * 10**(pow)
end
例子
floor_it 0.007425742694 #=> 0.0074257
floor_it 3852.574257425742694 #=> 3852.5
解释
为
f = 385.74957425742694
sig_digits = 5
步骤如下。首先用科学记数法表示数字(作为字符串(。参见内核#sprintf。
a = sprintf("%e", f)
#=> "3.857496e+02"
我们希望提取最后两位数字。
b = a[-3..-1]
#=> "02"
将其转换为整数。
pow = b.to_i
#=> 2
移动f
的小数点,以便在小数点左侧有一个非零数字。
f *= 10**(-pow)
#=> 3.8574957425742697
使用方法 Float#floor 获取所需的数字。
d = f.floor(sig_digits-1)
#=> 3.8574957425742697.floor(4)
#=> 3.8574
最后,将小数点移回其初始位置。
d * 10**(pow)
#=> 385.74