为什么带有 %.2g 的 printf 在点后不显示两位数字?

W.Z*_*Hai 3 c floating-point

#include <stdio.h>

int main()
{
    printf("%.2g %.2f\n", 2.925, 2.925);
}
Run Code Online (Sandbox Code Playgroud)

我认为正确的输出应该是:

2.93 2.93
Run Code Online (Sandbox Code Playgroud)

现在,输出如下:

2.9 2.92
Run Code Online (Sandbox Code Playgroud)

有两个误解:

  1. 为什么 '%.2g' 不显示点后的两位数?

  2. 为什么四舍五入?

use*_*733 6

1. 为什么有不同的位数?

printf转换规范中的精度字段对于fg转换是不同的。来自标准(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