Rounding a float number to a certain precision
我想将浮点数四舍五入到最多4位小数。 这意味着0.333333333将为0.3333,但0.33仍为0.33
-
C ++中float的round()的可能重复项
-
四舍五入为应用程序逻辑,还是四舍五入为字符串(显示在UI中)?这两件事是完全不同的问题!
-
如果输入是33333.333或0.00000333333333,您还会期望什么。
-
嗯,让我给你举个例子如果输入为0.12346,输出将为0.1235 0.42仍为0.42 0.523仍为0.523
-
您是要舍入输出,还是要舍入变量中的值?第一个是明智的,但是您似乎在要求第二个。答案因要执行的操作而异。
-
@Ti?nTr?n编辑您的问题,添加更多所需的测试数据。考虑很大或非常小的值,而不仅要考虑0.1和1.0之间的值。还要清楚说明您是否需要打印值,或者只是四舍五入以进行进一步的计算。
-
请注意,根据上下文的不同,有些答案不正确,有些则无用。例如,@ einpoklum答案可能是最好的(如果使用货币,则是最佳答案),也可以是总的过度杀伤力。全部取决于缺少的上下文。
-
@MarekR:实际上,我有两个答案。但是从OP应该描述上下文的意义上来说,您是正确的。
使用
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乘幂计算,乘法,除法和实际舍入。
-
还有另一种不使用自动的方法吗?顺便谢谢你<3
-
@Ti?nTr?n使用double而不是auto,但是我强烈建议您至少切换到c++11并实际使用auto。
-
@Ti?nTr?n:您不需要auto,可以使用float。或者您可以全部使用double来减少不准确性。
-
奇怪的是,setprecision对输出进行四舍五入,但是没有内置的方法选择round的位数
-
@ user463035818:我猜是因为round()来自C标准库。但是,您可能以为现在有人会提出这个建议。
将其转换为定点类型
如果您想使用固定数目的十进制数字对结果进行四舍五入,则表明您实际上并不需要浮点数的"浮点数"。好吧,在这种情况下,请将您的值转换为表示此类数字的类型。本质上,这将是一个(运行时变量)整数分子和一个编译时固定的分母(在您的情况下为10,000)。
网站上有一个关于定点数学的老问题:
做定点数学的最佳方法是什么?
但我建议您将CNL库视为最近/受欢迎的内容。另外,已经提出了一些将定点类型添加到标准库的建议。我不知道哪一个是最先进的,但是请看一下这一点:John McFarlane的定点实数。
回到您的特定情况:定点类型通常可以从浮点类型构造。就是那样
假设您需要打印四舍五入的数字,这是一种适当的解决方案:
1 2
| cout << setprecision(4) << x << '
'; |
std :: setprecision文档。
现场演示
在没有提供更多细节之前,不可能提供更好的答案。
请注意,如果您打算对数字x进行四舍五入然后进行打印,由于某些极端情况可能会产生比预期更长的结果,因此最终会很头疼。
-
我的印象是,您需要指定使用固定的精度,以便能够指定小数点后的位数nr。参见cplusplus.com/reference/ios/ios_base/precision
-
@ErikAlap是正确的。为了获得所需的行为,必须使用std::fixed << std::setprecision(n)。否则,将有n位的总精度。使用std::fixed指定n位的十进制精度。
-
@Richard谢谢您的评论。我忘了补充一点,科学记数法也具有与固定的相同的属性,即设置精度实际上将小数点后的数字设置为nr。
-
@Richard在哪里可以看到所需行为的详细描述?这就是为什么我已经写了this is one of a proper solutions。
-
@MarekR尽管原始帖子打算打印还是四舍五入到一个值上都是模棱两可的,但我认为将浮点数四舍五入到" 4个小数位"的理想行为是将浮点数四舍五入到小数点后4位。在没有std::fixed的情况下使用setprecision会截断诸如1234.5678之类的数字的小数部分(在原始答案中将其打印为1235)。
例如,这是一个解决方案:
1
| float ret = float(round(0.333333333 * 10000)) / 10000) |
您可以将其编写为函数。也许会有更好的方法?
-
它会截断而不是四舍五入。请改用round()。
-
这对0.33333333有效,但对3333.3333或0.00003333无效。