小林です。

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


>
> まあ、この点については、確かに厳密には文字列的問題が含まれますが、やは
> り sprintf() のかわりの記述というより、sprintf().to_f という、数値への
> 変換までを含めた処理を担うものでなければ、利便性があまり無いので、数値
> を返すメソッドという方向で検討したいと思います。
>
(略)
>
> なるほど。ところで、Excel には roundup, rounddown という関数があるそう
確かに Excel にもあるので、Float にあっても良いような気もします。
Excel がわざわざ用意しているのは、お金の計算で必要だから?

> です。Float#round_up, Float#round_down はいかがでしょうか? round に正
> 負で引数を指定するよりもわかりやすそうでもありますし。
>
ところが、負の引数もあるんですね、これが(以下 Excel のヘルプより)..
# 小数点の左まで考慮している

ROUNDUP(数値, 桁数)
    数値を指定された桁数に切り上げます。
   
    数値   切り上げの対象となる実数値を指定します。
    桁数   数値 を切り上げた結果の桁数を指定します。
    
    ROUNDUP 関数は、ROUND 関数に似た働きをしますが、
    常に数値の切り上げを行う点が異なります。

    桁数 に正の数を指定すると、数値 は小数点の右
    (小数点以下) の指定した桁に切り上げられます。
    桁数 に 0(ゼロ) を指定するか、または省略すると、
    数値 は最も近い整数に切り上げられます。
    桁数 に負の数を指定すると、数値 は小数点の左
     (整数部分) の指定した桁に切り上げられます。

> で、n を小数点以下の桁数として、Float#round(n), Float#round_up(n),
> Float#round_down(n) というのはいかがでしょう。
>
実現するための方法論まで含めて、議論が必要ですね。
Excel のように n<0 も必要なんでしょうか??

> -----
> 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
>
なんと! Excel はちがうんですね、

FLOOR(数値, 基準値)
  数値を挟む基準値の倍数のうち、0 に近い方の値を返します。

  数値     丸める数値を指定します。
  基準値   倍数の基準となる数値を指定します。

  数値 と 基準値 の符号が異なる場合、エラー値 #NUM! が返されます。
  数値 の符号に関係なく、丸められた値の絶対値は、数値 より小さくなります。
  数値 が既に 基準値 の倍数になっている場合は、その値が返されます。

   FLOOR(2.5, 1) = 2
   FLOOR(-2.5, -2) = -2
   FLOOR(-2.5, 2) = #NUM!
   FLOOR(1.5, 0.1) = 1.5
   FLOOR(0.234, 0.01) = 0.23

CEILING ってのもあるんですが同様です。なんだか、とってもメンドウ????
# きっと銀行系の方は理解できるのでしょう。


小林 茂雄
shigeo / tinyforest.gr.jp