四捨五入
数値計算をやっていると、浮動小数点型から整数型にキャストすることが多々ある。大抵の場合は単なる小数点以下切捨てで問題ありません。
double d = ・・・ int i = static_cast< int >( d );
ただ計算によっては四捨五入の方が都合が良いことも多々あります。その場合、大抵以下のようにします。
double d = ・・・ int i = static_cast< int >( d + 0.5 );
0.5だけ足してから小数点以下を切り捨てれば四捨五入になります。ただしこれ、正しく出来るのは元の値が正の場合だけです。負の場合は切り上げになります。なのでもっと正確には場合分けが必要になります。
double d = ・・・ int i; if( d < 0 ){ i = static_cast< int >( d - 0.5 ); }else{ i = static_cast< int >( d + 0.5 ); } }
これで負の数でも四捨五入が出来るのですが行数が増えてしまいました。もちろん1行で書くことも出来なくも無いですが・・・。
int i = static_cast< int >( d + (( d < 0 ) ? -0.5 : 0.5) );
もうちょっと綺麗にならないかな?と調べていたら、床関数・天井関数というのがあるんですね。床関数は「その数値を上回らない最大の整数」を返す関数で、天井関数は「その数値以上の最小の整数」を返す関数だそうです。これを使えばもうちょっとスッキリします。
int i = static_cast< int >( floor( d + 0.5 ) );
なお、天井関数を用いた場合、小数点以下がピッタリ0.5の場合切り下げられてしまいますので厳密な計算が必要な場合は
int i = static_cast< int >( ceil( d - 0.5 ) );
floorもceilも戻り値の型が引数と同じなので結局整数型にするにはキャストが必要なのはちょっと残念。
まあ結局のところ、どうやるかはその計算がどこまで正確さが必要かによると思います。