0.5を足してintにキャストして四捨五入するという迷信

他人のコードを読んでいると、たまに四捨五入するところで、こういうコードを見る。

float f;
// ...
int r = static_cast<int>(f + 0.5f);

これは、よく本にも載っていて、たしかに特定のユースケースでは間違いではない。

僕も昔は使っていた「ワザ」である。

しかし、僕はこういうコードは基本的に書くべきではないと思う。

そもそも、このコードはfが負の場合には正しく動かない。

float f = -1.1f;
// ...
int r = static_cast<int>(f + 0.5f);  // r = 0

C++の場合は、<cmath>includeして、std::nearbyint()を使えば良い。

float f = -1.1f;
// ...
int r = std::nearbyint(f);  // r = -1

用途に応じて、std::rint()std::round()を使っても良い。

他のプログラミング言語でも多くの場合、こういった関数があるはずである。

こういった関数を使用することで意図は明確になるし、不要なバグが混入するおそれが無くなるので、 世の中の人には積極的に使ってほしいと思っている。