我想将浮点数四舍五入到最多4个小数位。这意味着0.333333333将为0.3333,但0.33仍为0.33
答案 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。
在没有提供更多细节之前,不可能提供更好的答案。
请注意,如果您打算将数字x
进行四舍五入然后再打印,由于某些极端情况可能会产生比预期更长的结果,因此结局会非常令人头疼。
答案 3 :(得分:0)
如果您想对结果进行四舍五入,并使用固定数量的十进制数字,则表示您实际上并不需要浮点数的“浮点”形式。好吧,在这种情况下,请将您的值转换为表示此类数字的类型。本质上,这将是一个(运行时变量)整数分子和一个编译时固定的分母(在您的情况下为10,000)。
网站上有一个关于定点数学的老问题:
What's the best way to do fixed-point math?
但我建议您将CNL library视为最近/受欢迎的内容。另外,已经提出了一些将定点类型添加到标准库的建议。我不知道哪一个是最先进的,但请看一下:约翰·麦克法兰(John McFarlane)的Fixed-Point Real Numbers。
回到您的特定情况:定点类型通常可以从浮点类型构造。就是这样做。