四舍五入到第二个小数点 我如何绕过C++中的第二个小数点。 谢谢你的帮助。

四舍五入到第二个小数点 我如何绕过C++中的第二个小数点。 谢谢你的帮助。,c++,rounding,C++,Rounding,你可以乘以100,然后四舍五入为整数。然后将小数点放在前两位之后 例如: void round(double x) { double y = 100 * x; int rounded = (int)(y + 0.5); printf("%lf rounded = %d.%02d\n", x, rounded / 100, rounded % 100); } 看看哪一个是关于舍入浮动的,尽管不是两个位置。同样的基本技术也应该有效。如果您希望在双精度或浮点中得到准确的结果,那么这

你可以乘以100,然后四舍五入为整数。然后将小数点放在前两位之后

例如:

void round(double x)
{
   double y = 100 * x;
   int rounded = (int)(y + 0.5);
   printf("%lf rounded = %d.%02d\n", x, rounded / 100, rounded % 100);
}

看看哪一个是关于舍入浮动的,尽管不是两个位置。同样的基本技术也应该有效。

如果您希望在
双精度
浮点
中得到准确的结果,那么这可能是不可能的。许多可以用两个十进制数字精确表示的数字根本不能用以2为基数的浮点数来表示,而您得到的只是最接近的等价数字。例如,您可能会发现
1.10
被固定在
1.10000000000001
上,无论您尝试将其舍入多少次。

您没有指定需要哪种舍入。 假设四舍五入为最接近的整数:

#include <math.h>
#include <stdio.h>

double round(double x) { return floor(x * 100 + 0.5) / 100; }

int main()
{
    printf("%g\n", round(12.345));
}

打印双精度时,可以指定精度:

f、 f

双参数四舍五入并转换为[-]ddd.ddd样式的十进制表示法,其中小数点字符后的位数等于精度规格。如果精度缺失,则取6;如果精度显式为零,则不显示小数点字符。如果出现小数点,则至少有一位数字出现在其前面

尝试:

在C中也是这样++

std::cout << x << " rounded = " << std::setprecision(2) << x << "\n";

std::难道你不需要舍入进一步的数学运算或只是打印吗?请注意,这仍然会受到IEEE 754的精度问题的影响,这就是为什么这些东西通常会留到输出之前。不,这一位不会。舍入的边缘情况是0.5,这可以完美地表示为二进制分数。即小于等于xxxx.011111111111
的数字向下舍入到小于xxxx,小于xxxx.100000000000000的数字向上舍入到小于xxxx+1。(如果你已经受到IEEE754准确性问题的困扰,这可能会令人惊讶。例如,如果你认为
y
包含
0.145
-它不能。)你没有用0.145尝试你的代码,是吗?如果你是这个意思,实际上OP没有指定打破平局的规则。@Roland Illig:可能没有,因为IEEE754不能代表它<代码>0.1499999999当然应该四舍五入到“0.14”@Roland Illig:正如MSalters正确指出的那样,0.145应该四舍五入到0.14,代码就是这样做的。那你的意思是什么?可能我对代码考虑得不够。我怀疑在某些情况下,表达式
x*100+0.5
可能会导致不精确/意外的结果,这是可以避免的。但是当然,如果你用双精度表示十进制数,你应该会有这样的惊喜。好奇为什么有人认为这是错误的?关键是,它不会对
x
进行四舍五入,即使它输出的是
x
的四舍五入表示(顺便说一句,不是我的反对票)我的论点是,问题没有具体说明他想要舍入什么(变量表示或值的输出)。尝试对浮点值进行舍入注定会失败(因为舍入问题)。另一种解释是OP想要一个十进制值。
printf("%f rounded = %.2f\n", x, x);
std::cout << x << " rounded = " << std::setprecision(2) << x << "\n";