首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定Ruby中Fixnum的长度?

如何确定Ruby中Fixnum的长度?
EN

Stack Overflow用户
提问于 2012-12-23 02:44:45
回答 8查看 23.8K关注 0票数 9

在我正在编写的脚本中,我希望找到Ruby中Fixnum的长度。我可以做<num>.to_s.length,但是有没有办法直接找到Fixnum的长度而不把它转换成字符串呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-12-23 03:04:40

代码语言:javascript
复制
puts Math.log10(1234).to_i + 1 # => 4

您可以将其添加到Fixnum,如下所示:

代码语言:javascript
复制
class Fixnum
  def num_digits
    Math.log10(self).to_i + 1
  end
end

puts 1234.num_digits # => 4
票数 28
EN

Stack Overflow用户

发布于 2016-12-27 01:22:12

Ruby2.4有一个Integer#digits方法,它返回一个包含数字的数组。

代码语言:javascript
复制
num = 123456
num.digits
# => [6, 5, 4, 3, 2, 1] 
num.digits.count
# => 6 

编辑:

要处理负数(感谢@MatzFan),请使用绝对值。Integer#abs

代码语言:javascript
复制
-123456.abs.digits
# => [6, 5, 4, 3, 2, 1]
票数 13
EN

Stack Overflow用户

发布于 2018-02-19 21:04:17

Ruby 2.4+的侧记

我在不同的解决方案上运行了一些基准测试,Math.log10(x).to_i + 1实际上比x.to_s.length快得多。comment from @Wayne Conrad已过期。new solution with digits.count远远落在后面,尤其是数字更大的:

代码语言:javascript
复制
with_10_digits = 2_040_240_420

print Benchmark.measure { 1_000_000.times { Math.log10(with_10_digits).to_i + 1 } }
# => 0.100000   0.000000   0.100000 (  0.109846)
print Benchmark.measure { 1_000_000.times { with_10_digits.to_s.length } }
# => 0.360000   0.000000   0.360000 (  0.362604)
print Benchmark.measure { 1_000_000.times { with_10_digits.digits.count } }
# => 0.690000   0.020000   0.710000 (  0.717554)

with_42_digits = 750_325_442_042_020_572_057_420_745_037_450_237_570_322

print Benchmark.measure { 1_000_000.times { Math.log10(with_42_digits).to_i + 1 } }
# => 0.140000   0.000000   0.140000 (  0.142757)
print Benchmark.measure { 1_000_000.times { with_42_digits.to_s.length } }
# => 1.180000   0.000000   1.180000 (  1.186603)
print Benchmark.measure { 1_000_000.times { with_42_digits.digits.count } }
# => 8.480000   0.040000   8.520000 (  8.577174)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14005524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档