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") を使うべき、ということらしい。