青山です。

On Mon, 12 Jun 2000 14:34:46 +0900,
"Shigeo Kobayashi" <shigeo / tinyforest.gr.jp> wrote:

> そうなんですよ。 BigFloat を作っておきながら、自分で言うのもなんですが、
> 現実は Float と Fixnum/Bignum で事足りるんですよね。 ^^;;;

実際にはそうですね。しかし、ruby-math まであるという Ruby においては、
やはり BigFloat の存在は大きいでしょう。

> 丸め自体に誤差が入るので、「数値」として以後の計算にどれだけ意味が
> あるのか私にはよくわかりません。
> なら「指定した桁位置で丸めた文字列」を返すメソッド([ruby-math:00313]
> 的)? 「四捨五入」や「切捨て」機能を持つもの??

まあ、この点については、確かに厳密には文字列的問題が含まれますが、やは
り sprintf() のかわりの記述というより、sprintf().to_f という、数値への
変換までを含めた処理を担うものでなければ、利便性があまり無いので、数値
を返すメソッドという方向で検討したいと思います。

> ちょっと暇つぶしに Float#round を、オプショナル引数が付けられるように変
> 更してみました。テストした範囲では、予想外に、結構いけるようです。

お、さっそくですか。実際に動くものがあるといいですね。ありがとうござい
ます。で、結構いけそうですよね? まるめるという処理は、明かに元の値と
は異なる要素が含まれるものですから、そのあたりは利用者にも覚悟してもら
うという事で良いように思われますし。

> 新 round は引数なし、または引数の値がゼロか1のときは従来と同じ。
> 引数の値が正なら四捨五入、負なら切捨てになります。
> (BigFloat#round と同じ)

なるほど。ところで、Excel には roundup, rounddown という関数があるそう
です。Float#round_up, Float#round_down はいかがでしょうか? round に正
負で引数を指定するよりもわかりやすそうでもありますし。

で、n を小数点以下の桁数として、Float#round(n), Float#round_up(n),
Float#round_down(n) というのはいかがでしょう。

-----
ceil, floor と、四捨五入(round) に対する切上げ、切捨ては負数における動
きが違うので、別なメソッドを用意する必要がある事に、今ごろ気が付きました。

round(-1.4) --> -1,    round(-1.5) --> -2

        ceil    floor   to_i   round_up   round_down
 n.m   n + 1      n       n      n + 1        n
-n.m    -n     -(n-1)    -n    -(n + 1)      -n


--
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>