[#44431] コンストラクタの引数について&インスタンス変数の持ち方について — Akira Hayakawa <ruby@...>

度々オブジェクト指向についての質問ですいません。

17 messages 2008/01/04
[#44433] Re: コンストラクタの引数について&インスタンス変数の持ち方について — Yukihiro Matsumoto <matz@...> 2008/01/04

まつもと ゆきひろです

[#44469] pdf 作成 ライブラリ — "Luiz Aoki" <luizruby@...>

はじめまして、青木ルイスと申します、

14 messages 2008/01/12
[#44479] ファイル出力時のprintについて — m-hatake@... 2008/01/16

畠山と申します。

[#44483] format %g の丸めについて — 山崎雄介 <y-yamasaki@...>

山崎(ゆ)です。

14 messages 2008/01/16

[ruby-list:44510] Re: format %g の丸めについて

From: Tadashi Saito <shiba@...2.accsnet.ne.jp>
Date: 2008-01-17 12:49:49 UTC
List: ruby-list #44510
斎藤と申します。

On Wed, 16 Jan 2008 22:59:25 +0900
山崎雄介 <y-yamasaki@saeilo.co.jp> 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となって
しまうため、精度が保証できなくなる点は気を付けた方がよいかもしれません。

-- 
斎藤ただし

In This Thread