四捨五入をしていてふと詰まったことがあったので共有する。
結論だけ言うとちゃんとどこの言語にでもありそうなroundを使おうと言う話。(これも正確な四捨五入ではなく銀行丸めと言うものな場合もある)
私はC言語で四捨五入する時に以下のようなコードを書いていた。
float x=1.6;
int round_x = x + 0.5;
int型へのキャストでは少数部分が切り捨てられるのでさきに0.5を足しておくことで切り捨てが四捨五入に早変わりすると言うもの。
1.51の場合
1.51+0.5=2.01なので2.01の小数点以下を切り捨てるとちゃんと1.51の四捨五入である2になっている。
1.49の場合
1.49+0.5=1.99なので1.99の小数点以下を切り捨てるとちゃんと1.49の四捨五入にである1なっている。
今までこのコードに疑問など抱いたことはなかった。(intやfloatの精度が足りる限り)
しかし、このコードには問題がある。
負の数の時には0.5を足してはいけない
先ほどのコードで-2.3を四捨五入することを考えてみよう。
答えは-2になるべきであるが。
-2.3+0.5=-1.8
小数点を切り捨てると-1となってしまうのである。
知っている人にとっては当たり前の話かもしれないがこれに気づかずに1時間ほど詰まってしまった
ならばどうする?
四捨五入する対象が負の時には+0.5ではなく-0.5しなければならない。
少しめんどくさいので諦めてround関数を使ったほうが早いだろう。