为什么带有%.2g的printf在点后不显示两位数字?
#include <stdio.h>
int main()
{
printf("%.2g %.2fn", 2.925, 2.925);
}
我认为正确的输出应该是:
2.93 2.93
现在,输出如下:
2.9 2.92
有两个误解:
-
为什么 '%.2g' 不显示点后的两位数?
-
为什么四舍五入?
回答
1. 为什么有不同的位数?
printf转换规范中的精度字段对于f和g转换是不同的。来自标准(C17 草案,7.21.6 格式化输入/输出函数):
- 一个可选精度,给出 d、i、o、u、x 和 X 转换出现的最小位数,a、A、e、E、f 的小数点字符后出现的位数, 和 F 转换, g 和 G 转换的最大有效位数, ...
因此f,精度仅指定小数点后的位数,而精度g则是所有位数的最大位数。
2. 为什么数字四舍五入?
在源代码中使用浮点数时,需要在编译时将其从十进制形式转换为二进制形式。十进制数2.925不能以您double类型的有限精度完全转换为二进制形式,并且值略小 ( 2.92499999999999982236...)。当四舍五入为 2 个十进制数字时,最接近的值为2.92。