From: Tadashi Saito Date: 2008-01-17T21:49:49+09:00 Subject: [ruby-list:44510] Re: format %g の丸めについて 斎藤と申します。 On Wed, 16 Jan 2008 22:59:25 +0900 山崎雄介 wrote: > それから、BigDecimal.newの二つ目の引数に有効桁数を指定できるらしく、内部の計算に > は使われているようなのですが、フォーマットには反映されないようでした。 > > val = BigDecimal.new("0.00000815", 2) # 有効数字2桁のつもり > val.to_s => "0.815E-5" # 丸めてくれるかと期待したんですが。 自分の理解ではですが、第二引数は外部的には割り算のときに使われるのみで、 あとは内部処理に使われる(あらかじめ用意される内部配列のサイズを指定)だけで あったと記憶しています。 非常にめんどくさいですが確実な方法としては、BigDecimal#splitがあります。 これを使うと、内部情報を生に近い状態で得ることができますから、 val = BigDecimal.new("0.00000815") sign, str, base, exp = val.split # => 1, "815", 10, -5 v2 = BigDeciaml.new("0." + str) v3 = v2.round(2) # 丸めたい桁数を指定 TEN = BigDecimal("10") v4 = v3 * TEN ** exp puts v4 #=> 0.82E-5 と、比較的お望みに近いモノが得られると思います。 # signやbaseは、まず使うことはないでしょう。 ここで、TENを「10」とリテラルIntegerで指定してしまうと、expが負の時に 「10 ** exp」がFloatとなります。 BigDecimalはFloatを黙って受け入れ、かつその結果はFloatとなって しまうため、精度が保証できなくなる点は気を付けた方がよいかもしれません。 -- 斎藤ただし