BigDecimal の値を "%.3f" % value
のような感じで出力したら思いがけない出力だったのでびっくりした。
require "bigdecimal"
s = "11111111111111111111.123"
bd=BigDecimal(s, 40)
puts "%.3f" % bd #=>11111111111111110656.000
puts bd.to_s("F") #=>11111111111111111111.123
こんな感じ。
どうも、"%.3f" % value
だと、一旦普通の Float に変換されてるっぽい。
試しに Float の最大値より大きな値を入れてみると
require "bigdecimal"
huge = BigDecimal( "1e400" )
puts "%f" % huge #=> Inf
puts huge.to_s("F") #=> 1000(中略)00
値は有限なのに出力は、 Inf
になってしまう。
というわけで、BigDecimal
の出力には "%f"
ではなく to_s("F")
を使うべき、ということらしい。