获取三个有效数字的方法



我想将值四舍五入为三个有效数字。我想得到以下答案:

39.07 -> 39.1
9.0712 -> 9.07
9.0071-> 9.01
0.01523 -> 0.0152
0.00150 -> 0.0015
39.01233 -> 39

如果小数点前的有效数字超过三个,则应显示小数点之前的所有数字:

11327 -> 11327
11327.314 -> 11327
11327.84 -> 11328
class Float
def signif(signs)
Float("%.#{signs}g" % self)
end
end
> (39.07).signif(3) #=> 39.1
> (9.0712).signif(3) #=> 9.07 
> (9.0071).signif(3) #=> 9.01
> (0.01523).signif(3) #=> 0.0152 
> (0.00150).signif(3) #=> 0.0015 
> (39.01233).signif(3) #=> 39.0 

> require 'bigdecimal'
> BigDecimal.new(39.07, 3).to_f #=> 39.1
> BigDecimal.new(9.0712, 3).to_f #=> 9.07 
> BigDecimal.new(9.0071, 3).to_f #=> 9.01
> BigDecimal.new(0.01523, 3).to_f #=> 0.0152 
> BigDecimal.new(0.00150, 3).to_f #=> 0.0015 
> BigDecimal.new(39.01233, 3).to_f #=> 39.0

更新:

如上所述,解决方案不支持小数点前的三个有效数字。 所以我动态地取了重要,现在你可以传递任何大数字。 无需通过显着。根据 Cary Swoveland 的评论,如果值等于整数版本,则应返回整数值而不是浮点数。

class Float
def dynamic_signif
f = Float("%.#{self.to_i.to_s.size}g" % self)
n = (f==f.to_i) ? f.to_i : f
end
end  
> (11327.314).dynamic_signif #=> 11327
> (11327.84).dynamic_signif #=> 11328

注意:由于此方法属于Float类,因此它不适用于FixNum,您可能需要将 Fixnum 转换为 Float。

相关内容

最新更新