Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在不舍入的情况下将浮点值打印到小数点后2位_C - Fatal编程技术网

C 如何在不舍入的情况下将浮点值打印到小数点后2位

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

例如,我想用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 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));