我需要将任何浮点数转换为5位有效数字格式。它表示五个第一个非零数字(最后一个数字未向上舍入)。
实施例
Float("%.#{5}g" % 0.007425742694) => 0.0074257
Float("%.#{5}g" % 3852.574257425742694) => 3852.6
这种方法的问题在于3852.574257425742694四舍五入为3852.6,我需要3852.5。
答案 0 :(得分:2)
我知道这些数字是非负面的。人们可以做到以下几点:
<强>代码强>
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
步骤如下。首先用科学记数法表示数字(作为字符串)。请参阅Kernel#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