小林です。

----- Original Message -----
From: "Wakou Aoyama" <wakou / fsinet.or.jp>
Subject: [ruby-math:00322] Re: Float#ceil, Float#floor, Float#round


> > FLOOR(数値, 基準値)
> >   数値を挟む基準値の倍数のうち、0 に近い方の値を返します。
>
> > CEILING ってのもあるんですが同様です。なんだか、とってもメンドウ????
> > # きっと銀行系の方は理解できるのでしょう。
>
> これはちょっと変かも。floor(-1.n) --> -1 って事ですよね。
>
はい、実際 FLOOR(-1.5, -1) ==> -1 になるので、そういうことです。

> まあ、確かに銀行系ではそうなのでしょうけれど、素直に round_up, down を
> 使うべきのような。逆に言えば、無限小に近い方の値を返す関数が無いという
> 事ですよね。そういうのが必要な場合、Excel ではどうするのやら。
>
ROUNDがあります。
ROUND(-1.475,2) ==> -1.48

> という事で、ここまでをまとめると、ceil, floor とは別に round,
> round_up, round_down を用意する。ceil, floor は無限小を基準のままとし、
> round 系は 0 を基準とする。引数は数値で、正では小数部、負では整数部の
> 桁数を指定する。という感じでいかがでしょう?
>
えっと、全て絶対値で round は四捨五入、round_up は繰り上げ
round_down は切り捨てですよね。
a.round_up と a.round_down は、a が正か負で a.ceil や a.floor と
まったく同じことになるので、わざわざ用意するのはどうでしょう?

わたしは、round,ceil,floor にオプショナルな引数を追加して、
以下のようにしたらどうかと思うのですが、いかがでしょう?

a.round[(n)]
 n>=0 なら小数点以下 n+1 位を四捨五入する。
    (小数点以下を最大で n 桁にする)。
 n<0 なら小数点から左 n 桁目で四捨五入する。
    (整数で且つ、整数部 n 桁をゼロにする)。

a.ceil[(n)]/floor[n]
 n>=0 なら小数点以下 n+1 位を ceil/floor する。
 n<0 なら小数点から左 n 桁目で ceil/floor する。

これで、Excel がやっていることはカバーしていると思います。

引数 n が無いときは、今までどおり整数(Fixnum/Bignum)
が返る。引数 n があるときは Float が返る。

いずれにせよ、このような機能を入れるかどうか
も含めて、他の方の意見はどうなんでしょう?


小林 茂雄
shigeo / tinyforest.gr.jp