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
ОБНОВЛЕНИЕ:
Как указано выше, решение не поддерживает болеетри значащие цифры перед десятичной точкой.поэтому я взял значимое динамически, теперь вы можете передавать любые большие цифры.не нужно проходить значительное.В соответствии с комментарием Кэри Свовеланда , если значение равно целочисленной версии, должно возвращать целочисленное значение вместо Float.
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
ПРИМЕЧАНИЕ: Поскольку этот метод принадлежит *Класс 1020 *, поэтому он не будет работать для FixNum
, возможно, вам потребуется конвертировать Fixnum в Float.