小数点以下を切り上げたり切り下げたりする話は、意外と疎かにされがちな(コードのお守りを押し付けられたりする)ので、今更ながら改めて整理しよう。
- floor(x)
- 切り下げ。小数点以下がゼロでなければ、xより小さくxにもっとも近い整数を返す。
- ceil(x)
- 切り上げ。小数点以下がゼロでなければ、xより大きくxにもっとも近い整数を返す。
- round(x)
- 四捨五入。xにもっとも近い整数を返す。ちょうど2つの整数の中間だった場合(3.5とか)は絶対値が大きいほうを選ぶ。
- (int) x
- 切り捨て。小数点以下がゼロでなければ、xより絶対値が小さくxにもっとも近い整数を返す。
x | floor(x) | ceil(x) | round(x) | (int) x |
---|---|---|---|---|
2.5 | 2.0 | 3.0 | 3.0 | 2 |
2.0 | 2.0 | 2.0 | 2.0 | 2 |
1.4 | 1.0 | 2.0 | 1.0 | 1 |
0.0 | 0.0 | 0.0 | 0.0 | 0 |
-1.4 | -2.0 | -1.0 | -1.0 | -1 |
-2.0 | -2.0 | -2.0 | -2.0 | -2 |
-2.5 | -3.0 | -2.0 | -3.0 | -2 |
floo()やceil()が符号を気にしないのに対して、round()や整数型へのキャストの挙動は正負対象となる。ハードウェアのCモデルを作る人は、ここらへんをきちんと考えながら書いてくれ。…って言うか、固定小数点のハードウェアモデルを書くのにdoubleとか使うなよ。
0 件のコメント:
コメントを投稿