关于c ++:将浮点数四舍五入到一定的精度

Rounding a float number to a certain precision

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


使用std::round()函数

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

1
float round ( float arg );

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

1
2
3
4
5
6
7
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乘幂计算,乘法,除法和实际舍入。


将其转换为定点类型

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

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

做定点数学的最佳方法是什么?

但我建议您将CNL库视为最近/受欢迎的内容。另外,已经提出了一些将定点类型添加到标准库的建议。我不知道哪一个是最先进的,但是请看一下这一点:John McFarlane的定点实数。

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


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

1
2
cout << setprecision(4) << x << '
'
;

std :: setprecision文档。

现场演示

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

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


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

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

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