将浮点数四舍五入到一定精度

时间:2019-03-08 13:26:58

标签: c++ floating-point rounding precision

我想将浮点数四舍五入到最多4个小数位。这意味着0.333333333将为0.3333,但0.33仍为0.33

4 个答案:

答案 0 :(得分:2)

使用std::round()函数

C ++标准库提供functions用于执行舍入。对于float,它是:

float round ( float arg );

这会将arg舍入到最接近的整数值。现在,您想要一个不同的十进制分辨率。因此,不要舍入您的值,而是舍入您的值乘以10000,因此您的单位数现在是以前的0.0001位数。或更笼统:

float my_round(
    float x,
    int num_decimal_precision_digits)  
{
    float power_of_10 = std::pow(10, num_decimal_precision_digits);
    return std::round(x * power_of_10)  / power_of_10;
}

请注意,可能存在精度问题,因为浮点计算和表示仅在一定数量的数字内才是精确的,并且在my_round中,我们至少有四个此类误差的来源: -10的计算,乘法,除法和实际舍入。

答案 1 :(得分:0)

这是一个解决方案,例如:

float ret = float(round(0.333333333 * 10000)) / 10000)

您可以将其编写为函数。也许会有更好的方法吗?

答案 2 :(得分:0)

假设您需要打印四舍五入的数字,这是一种适当的解决方案:

cout << setprecision(4) << x << '\n';

std::setprecision documentation

Live demo

在没有提供更多细节之前,不可能提供更好的答案。

请注意,如果您打算将数字x进行四舍五入然后再打印,由于某些极端情况可能会产生比预期更长的结果,因此结局会非常令人头疼。

答案 3 :(得分:0)

将其投射为定点类型

如果您想对结果进行四舍五入,并使用固定数量的十进制数字,则表示您实际上并不需要浮点数的“浮点”形式。好吧,在这种情况下,请将您的值转换为表示此类数字的类型。本质上,这将是一个(运行时变量)整数分子和一个编译时固定的分母(在您的情况下为10,000)。

网站上有一个关于定点数学的老问题:

What's the best way to do fixed-point math?

但我建议您将CNL library视为最近/受欢迎的内容。另外,已经提出了一些将定点类型添加到标准库的建议。我不知道哪一个是最先进的,但请看一下:约翰·麦克法兰(John McFarlane)的Fixed-Point Real Numbers

回到您的特定情况:定点类型通常可以从浮点类型构造。就是这样做。