RangeError:bignum太大而无法转换成`long'

时间:2012-04-05 07:19:16

标签: ruby irb bignum

num = "0000001000000000011000000000000010010011000011110000000000000000"
for n in 0...num.length 
   temp = num[n] 
   dec =  dec + temp*(2**(num.length - n - 1))
end
puts dec

当我在irb中运行此代码时,以下错误消息是输出。当我在python中编译相同的逻辑时,它工作得很好。我用谷歌搜索了“RangeError:bignum太大而无法转换为'long':但没有找到相关的答案。 请帮帮我:(先谢谢。

RangeError: bignum too big to convert into long'
        from (irb):4:in*'
        from (irb):4:in block in irb_binding'
        from (irb):2:ineach'
        from (irb):2
        from C:/Ruby193/bin/irb:12:in `'

2 个答案:

答案 0 :(得分:5)

num[n]获得的是一个字符串,而不是数字。我将你的代码重写为更惯用的Ruby,这就是它的样子:

dec = num.each_char.with_index.inject(0) do |d, (temp, n)| 
  d + temp.to_i * (2 ** (num.length - n - 1))
end

然而,最惯用的可能是num.to_i(2),因为正如我所看到的那样,你试图将二进制转换为十进制,这正是它的作用。

答案 1 :(得分:3)

试试这个

num = "0000001000000000011000000000000010010011000011110000000000000000"
dec = 0
for n in 0...num.length 
   temp = num[n] 
   dec =  dec + temp.to_i * (2**(num.length - n - 1))
end
puts dec