web-dev-qa-db-ja.com

C ++のRound()はどこにありますか?

重複: C++のfloatの場合はround()


VS2008を使用しており、math.hをインクルードしていますが、まだラウンド関数が見つかりません。存在しますか?

グーグルで「0.5を追加してintにキャスト」ソリューションの束を見ています。それがベストプラクティスですか?

38
Jason Punyon

C++ 11の std::round() を使用できます。

まだ古い標準にこだわっている場合は、 std::floor() を使用できます。これは常に小さい方の数値に丸められ、 std::ceil() 、常により高い数値に丸められます。

通常の丸め動作を得るには、実際にfloor(i + 0.5)を使用します。

この方法では、負の数に関する問題が発生します。その問題の回避策は、負の数にceil()を使用することです。

double round(double number)
{
    return number < 0.0 ? ceil(number - 0.5) : floor(number + 0.5);
}

別の、よりクリーンですが、よりリソースを消費する方法は、文字列ストリームと入力/出力マニピュレーターを使用することです:

#include <iostream>
#include <sstream>

double round(double val, int precision)
{
    std::stringstream s;
    s << std::setprecision(precision) << std::setiosflags(std::ios_base::fixed) << val;
    s >> val;
    return val;
}

リソースが不足していない場合、および/または精度を制御する必要がある場合にのみ、2番目のアプローチを使用してください。

63

floor(num + 0.5)を使用しても、負の数では機能しません。その場合、ceil(num - 0.5)を使用する必要があります。

double roundToNearest(double num) {
    return (num > 0.0) ? floor(num + 0.5) : ceil(num - 0.5);
}
15
Bill the Lizard

実際、Microsoft math.hにはラウンド関数はありません。
ただし、代わりに静的メソッドMath :: Round()を使用できます。
(プロジェクトのタイプによって異なります。)

3

それがベストプラクティスであるかどうかはわかりませんが、floor()で0.5テクニックを使用するのが良い方法のようです。

0
Elroy