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()
を使っても良い。
他のプログラミング言語でも多くの場合、こういった関数があるはずである。
こういった関数を使用することで意図は明確になるし、不要なバグが混入するおそれが無くなるので、 世の中の人には積極的に使ってほしいと思っている。