From: dezawa Date: 2014-04-24T21:13:06+09:00 Subject: [ruby-list:49819] Re: 小数点以下の表示で質問があります。 出沢です この話ですが、 「小数点以下の十進数を二進数で表すと誤差が出る」 と言うこととは違う点で興味を持ちました。 Float#to_s と "%18.16f"%float では結果が違う! それとも、rubyのfloatでは .16fは出しすぎ? 試しに、計算結果としてではなく、数値リテラルで試してみました。 (1.9.3のirb) [0.9999990000000001,0.9999999000000001,0.9999999900000001]. each{|f| puts "%18.16f"%f} 0.9999990000000001 0.9999999000000001 0.9999999900000001 => [0.9999990000000001, 0.9999999, 0.9999999900000001] ということで、numeric.cのflo_to_s と spritf の case 'f' を ざっとみてみたのですが、残念ながら3分ぐらいでは理解できません でした。 ふと、ruby1.8.7のirbで試してみると 0.9999990000000001 0.9999999000000001 0.9999999900000001 => [0.999999, 0.9999999, 0.99999999] to_sの結果が異なります。 diff -u {ruby-1.8.7-p358,ruby-2.0.0-p353}/numeric.c|less してみましたら、 ruby1.8.7 では Cの sprintf で変換してますが、2.0.0 では sprintfは使って居ませんでした。 質問 ruby2 では sprintf を使わなくなったのは何か理由があるのでしょうか? 蛇足 53log2 = 15.95 やはり Float(実態はCのdouble?) では16桁出すのは微妙に多すぎ? だから、1.8.7のto_sでは .16g ではなく .15g で変換してるのか?