Ruby 获取三个有效数字的方法

Ruby 获取三个有效数字的方法,ruby,rounding,Ruby,Rounding,我想将值舍入到三个有效数字。我想得到如下答案: 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 或 > require 'bi

我想将值舍入到三个有效数字。我想得到如下答案:

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

> 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

更新:

如上所述,解决方案不支持小数点前超过三个有效数字。所以我已经采取了重要的动态,现在你可以通过任何大的数字。不需要通过重要的考试。根据,如果值等于整数版本,则应返回整数值而不是浮点值

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。

嗨,Gagan,非常感谢您的回答。它适用于给定的示例。但以下情况不支持此方法。正确的?11327.314->11327(如果小数点前有三个以上的有效数字,则应显示小数点前的所有数字。对于三个有效数字,需要考虑这一点)@Kalpa-W在这种情况下,您需要使用有效数字作为
5
,这里是输出
BigDecimal.new(11327.314,5).to_f=>11327.0
@Kalpa-W:我已经更新了我的答案,你不需要通过有效数字,它将适用于小数点之前的任何有效数字。mudsie(又名@Aleksei),也许是这样,但它一直是。我不认为这是离题的。但应该更具建设性。请参考以下链接了解“如何提出一个好问题”,因此,
0.0000000000 150
应该变成
0.0000000000 15
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