38

重复:round() 用于 C++ 中的浮点数


我正在使用 VS2008 并且我已经包含了 math.h 但我仍然找不到圆形函数。它存在吗?

我在 google 上看到一堆“添加 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);
}

另一种更简洁但更耗费资源的方法是使用字符串流和输入/输出操纵器:

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

如果您的资源不低和/或需要控制精度,请仅使用第二种方法。

于 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

Microsoft math.h 中实际上没有圆形函数。
但是,您可以改用静态方法 Math::Round()。
(取决于您的项目类型。)

于 2009-02-16T19:07:49.423 回答
0

我不知道这是否是最佳实践,但使用 0.5 技术和 floor() 似乎是要走的路。

于 2009-02-16T19:08:51.293 回答