C 如何在不舍入的情况下将浮点值打印到小数点后2位
例如,我想用c打印一个小数点后两位的值,而不进行四舍五入 比如:C 如何在不舍入的情况下将浮点值打印到小数点后2位,c,C,例如,我想用c打印一个小数点后两位的值,而不进行四舍五入 比如: 将打印91.83,但我希望输出仅为91.82。怎么做?唯一简单的方法是使用snprintf打印到一个足够长的缓冲区,以保存整个精确值,然后将其截断为字符串。比如: char buf[2*(DBL_MANT_DIG + DBL_MAX_EXP)]; snprintf(buf, sizeof buf, "%.*f", (int)sizeof buf, x); char *p = strchr(buf, '.'); // beware
将打印
91.83
,但我希望输出仅为91.82
。怎么做?唯一简单的方法是使用snprintf
打印到一个足够长的缓冲区,以保存整个精确值,然后将其截断为字符串。比如:
char buf[2*(DBL_MANT_DIG + DBL_MAX_EXP)];
snprintf(buf, sizeof buf, "%.*f", (int)sizeof buf, x);
char *p = strchr(buf, '.'); // beware locale-specific radix char, though!
p[2+1] = 0;
puts(buf);
我建议采用更短更快的方法:
printf("%.2f", ((signed long)(fVal * 100) * 0.01f));
这样您就不会溢出int,加上乘以100不应该影响有效位/尾数本身,因为唯一真正改变的是指数。制作一个字符串,然后打印哦!所以我的评论是正确的:),对于
DBL\u MANT\u DIG
和DBL\u MAX\u EXP
,应该包含哪个文件?为什么要乘以2
?,对于nul符号,它应该是buf[2*(DBL\u MANT\u DIG+DBL\u MAX\u EXP)+1]
。最小的浮点值实际上需要小数点后的DBL\u MANT\u DIG-DBL\u MIN\u EXP
(可能减少一位)才能精确打印,但由于所需的位数是两位,您可以将微小值直接短路到0.00
,并且只处理大于相当大阈值的值,将小数点后所需的位数减少到DBL\u MANT\u DIG
加上一个小常量。@GrijeshChauhan:为了处理编辑的注释:因子2是小数点前后都有空格(如果数字是大整数)。实际上,大约1.3的值可以代替2,但是我太懒了。不需要+1,因为我已经高估了;如果是,它无论如何都需要是a+2(对于基数)。也许你想要p[2+1]=0
?这不起作用。乘以100是有损的,并且引入了舍入步骤。如果fVal
大于INT\u MAX/100
,则该操作也会失败。
printf("%.2f", ((signed long)(fVal * 100) * 0.01f));