我使用 Ruby 2.2.3 和 Rails 4.2.3 。我在 irb 控制台中使用以下代码获得NoMemoryError: failed to allocate memory
:
# Using 123e+1000000000000000000
BigDecimal('123e+1000000000000000000').to_s
#=> NoMemoryError: failed to allocate memory
但这个数字越大的例子就越有效:
# Using 123e+1000000000000000000000000000000000
BigDecimal('123e+1000000000000000000000000000000000').to_s
#=> "Infinity"
这里是BigDecimal
的代码:https://github.com/rails/rails/blob/v4.2.3/activesupport/lib/active_support/core_ext/big_decimal/conversions.rb
答案 0 :(得分:2)
你内存不足的事实并不奇怪。数字123e+1000000000000000000
有一个五分之一的零。将它表示为一个字符串将需要一个五角形字符。
每个字符一个字节,您可以查看(大致)10^18
字节,10^15
千字节,10^12
兆字节或10^9
千兆字节。因此,除非你拥有10亿GB的RAM,否则它将无法正常工作。
一旦传递给BigDecimal
构造函数的数字传递了可以在系统上表示的最大数字,它将溢出到常量BigDecimal::INFINITY
,当转换为字符串时,它只是{{} 1}},并且可以清楚地适应记忆:
Infinity
答案 1 :(得分:0)
为什么不将它转换为浮动?这对我有用:
BigDecimal('123e+1000000000000000000').to_f
=> Infinity