LoginSignup
0
0

More than 5 years have passed since last update.

BigDecimal と "%f" の罠 ( ruby )

Posted at

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0