38

複製:C ++のfloatのround()


VS2008を使用していて、math.hを含めましたが、それでもラウンド関数が見つかりません。それは存在しますか?

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

4

4 に答える 4

62

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);
}

もう1つの、よりクリーンな、しかしよりリソースを消費する方法は、文字列ストリームと入出力マニピュレーターを利用することです。

#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番目のアプローチを使用してください。

于 2009-02-16T19:07:02.810 に答える
14

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

double roundToNearest(double num) {
    return (num > 0.0) ? floor(num + 0.5) : ceil(num - 0.5);
}
于 2009-02-16T19:15:59.903 に答える
3

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

于 2009-02-16T19:07:49.423 に答える
0

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

于 2009-02-16T19:08:51.293 に答える