如何计算Float中的小数位数?

时间:2011-12-21 23:35:50

标签: ruby-on-rails ruby

我正在使用Ruby 1.8.7和Rails 2.3.5。

如果我有一个12.525的浮点数,怎样才能获得小数点后的位数?在这种情况下,我希望得到'3'。

7 个答案:

答案 0 :(得分:20)

类似的东西,我想:

n = 12.525
n.to_s.split('.').last.size

答案 1 :(得分:15)

你应该非常小心你想要的东西。 Floating point numbers非常适合用于科学目的,并且主要用于日常使用,但是当你想要知道诸如“小数点后多少位数”之类的东西时,它们会分崩离析 - 只是因为它们{{3} },并非所有这些都包含用于计算的准确数据。 (或者,在格式化输出数字时,某些库实际上可能会在数字末尾丢弃准确的数据,理由是“舍入数字更友好”。这虽然经常是真的,但意味着它可能有点危险。依赖格式化的输出。)

如果您可以用BigDecimal类替换标准浮点数以提供任意精度的浮点数,那么您可以检查“原始”数字:

> require 'bigdecimal'
=> true
> def digits_after_decimal_point(f)
>   sign, digits, base, exponent = f.split
>   return digits.length - exponent
> end
> l = %w{1.0, 1.1, 1000000000.1, 1.0000000001}
=> ["1.0,", "1.1,", "1000000000.1,", "1.0000000001"]
> list = l.map { |n| BigDecimal(n) }
=> [#<BigDecimal:7f7a56aa8f70,'0.1E1',9(18)>, #<BigDecimal:7f7a56aa8ef8,'0.11E1',18(18)>, #<BigDecimal:7f7a56aa8ea8,'0.1000000000 1E10',27(27)>, #<BigDecimal:7f7a56aa8e58,'0.1000000000 1E1',27(27)>]
> list.map { |i| digits_after_decimal_point(i) }
=> [0, 1, 1, 10]

当然,如果转移到BigDecimal会使您的应用程序太慢或者显然太强大而无法满足您的需求,这可能会使您的代码过于复杂而无法获得真正的好处。您必须决定什么对您的申请最重要。

答案 2 :(得分:10)

这是一种非常简单的方法。在等于其等效整数之前,记录您需要将该数字乘以10的次数:

def decimals(a)
    num = 0
    while(a != a.to_i)
        num += 1
        a *= 10
    end
    num   
end

decimals(1.234) # -> 3
decimals(10/3.0) # -> 16

答案 3 :(得分:2)

喜欢这个:

theFloat.to_s.split(".")[1].length

它不是很漂亮,但您可以将其作为Float的方法插入:

class Float
    def decimalPlaces
      self.to_s.split(".")[1].length
    end
end

答案 4 :(得分:0)

你能减去地板然后只算剩下多少个字符?

(12.525 - (12.525.floor))。to_s.length-2 =&GT; 3

编辑:nope这不适用于一系列原因,负面和0.99999问题

答案 5 :(得分:0)

Olexandr的答案不适用于整数。可以尝试以下方法:

def decimals(num)
  if num
    arr = num.to_s.split('.')
    case arr.size
      when 1
        0
      when 2
        arr.last.size
      else
        nil
    end
  else
    nil
  end
end

答案 6 :(得分:0)

您可以使用此方法

$('.paginator-itemLink').on('click', () => getHref(this));
$('.paginator-itemLink').on('click', () => getHref.$(this));
....