计算有效位数

  • 本文关键字:有效位 计算 ruby
  • 更新时间 :
  • 英文 :


我需要将任何浮点数转换为 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

最新更新