我正在使用Ruby 1.8.7和Rails 2.3.5。
如果我有一个12.525的浮点数,怎样才能获得小数点后的位数?在这种情况下,我希望得到'3'。
答案 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));
....