四舍五入到第二个小数点 我如何绕过C++中的第二个小数点。 谢谢你的帮助。
你可以乘以100,然后四舍五入为整数。然后将小数点放在前两位之后 例如:四舍五入到第二个小数点 我如何绕过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); } 看看哪一个是关于舍入浮动的,尽管不是两个位置。同样的基本技术也应该有效。如果您希望在双精度或浮点中得到准确的结果,那么这
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";