C++ 如何在小数位数达到一定数量(无舍入)后截断浮点数?

C++ 如何在小数位数达到一定数量(无舍入)后截断浮点数?,c++,c,printf,C++,C,Printf,我试图以2点精度打印数字684.545007,即在684.54之后截断(不四舍五入)数字 当我使用 var = 684.545007; printf("%.2f\n",var); 它输出684.55,但我想得到的是684.54 有人知道我该如何纠正这个问题吗?您要查找的是截断。这应该是可行的(至少对于不是非常大的数字): 转换为整数将截断小数部分 在C++11或C99中,您可以为此使用专用函数(从标题或中)。这将避免对适合整数类型的值的限制 std::trunc(100 * var) / 10

我试图以2点精度打印数字
684.545007
,即在
684.54
之后截断(不四舍五入)数字

当我使用

var = 684.545007;
printf("%.2f\n",var);
它输出
684.55
,但我想得到的是
684.54


有人知道我该如何纠正这个问题吗?

您要查找的是截断。这应该是可行的(至少对于不是非常大的数字):

转换为整数将截断小数部分

在C++11或C99中,您可以为此使用专用函数(从标题
中)。这将避免对适合整数类型的值的限制

std::trunc(100 * var) / 100     // no need for casts

这是我的方法。它看起来很难看,但在大多数情况下确实有效,例如var可以大于int,可以是零或奇怪的“-0”。但它不处理无穷大和nan

double var = 684.545007; // or whatever
double var_trunc = var>=0. ? floor(var*100.)/100. : ceil(var*100.)/100.;
printf ("%g\n", var_trunc);

如果您期望的是
684.54
,那么您期望的结果是错误的。就这么简单。因为我不想要一个舍入值。此代码是编程在线判断代码解决方案的一部分。再次说明:舍入不像您显然希望的那样工作。@JackManey,当然不是。数字是684.545而不是684.555。输出应该是.54不是。55似乎您对“精度”的含义有错误的理解。如果您有C99标准库,那么您可以使用
trunc()
,这将适用于更大范围的数字。@caf:谢谢,我添加了这一点。不知是否有人会建议
lrint()
对于第一个解决方案。由于.005不可精确表示,这必然会对一些值产生错误的结果。
printf("%.2f\n", var - 0.005);
double var = 684.545007; // or whatever
double var_trunc = var>=0. ? floor(var*100.)/100. : ceil(var*100.)/100.;
printf ("%g\n", var_trunc);