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

Ren*_*eno 9 ruby ruby-on-rails

我使用的是Ruby 1.8.7和Rails 2.3.5.

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

Ole*_*nyk 21

我想这样的事情:

n = 12.525
n.to_s.split('.').last.size
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果`n`是一个整数,当你可能想要一个零时,这将返回1.当我混合整数和浮点数时,这让我感到沮丧. (4认同)
  • `如果不是num.to_s.include,则返回0?" .'` (4认同)
  • 这对于非常小的数字不起作用。示例:`n = 0.000001;n.to_s # => "1.0e-06"`. 您应该使用:`format("%f", n)` 来获得一致的格式。 (2认同)

sar*_*old 15

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

如果可以用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]
Run Code Online (Sandbox Code Playgroud)

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

  • TAKE CARE:值0返回1(应为0),值10返回-1. (2认同)

Mat*_*eer 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
Run Code Online (Sandbox Code Playgroud)