计算有效位数

时间:2017-08-22 15:59:03

标签: ruby

我需要将任何浮点数转换为5位有效数字格式。它表示五个第一个非零数字(最后一个数字未向上舍入)。

实施例

Float("%.#{5}g" % 0.007425742694) => 0.0074257
Float("%.#{5}g" % 3852.574257425742694) => 3852.6

这种方法的问题在于3852.574257425742694四舍五入为3852.6,我需要3852.5。

1 个答案:

答案 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