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)
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使您的应用程序太慢或显然太强大而无法满足您的需求,这可能会使您的代码过于复杂,从而没有真正的好处.您必须决定什么对您的应用程序最重要.
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)