为什么在使用 printf float 和 double 时显示相同的位数?

Why when using printf float and double show the same number of digits?

我想看看使用 float 和使用 double 时得到的位数有多少不同,但得到的结果相同

#include <stdio.h>

int main()
{
    float x=1.2222222222222222f;
    printf("%f %d", x,sizeof(x)); // This is what it prints out 1.222222 4
    return 0;
}
#include <stdio.h>

int main()
{
    double x=1.2222222222222222;  
    printf("%f %d", x,sizeof(x));  // This is what it prints out 1.222222 8
    return 0;
}

它打印出相同的值,即使 double 显然是大小的两倍并且应该保存更多数字。我做错了什么?

sizeofreturnssize_t。要打印 size_t 你需要 %zu 而不是 %d

如果您想查看 floatdouble 之间的真正区别,您需要使用 %.NUMBERf

打印更多数字

喜欢:

#include <stdio.h>

int main(void)
{
    float x=1.2222222222222222f;
    printf("%.70f %zu\n", x,sizeof(x)); 
    double y=1.2222222222222222;  
    printf("%.70f %zu\n", y,sizeof(y)); 
    return 0;
}

输出:

1.2222222089767456054687500000000000000000000000000000000000000000000000 4
1.2222222222222220988641083749826066195964813232421875000000000000000000 8

It prints out the same value even tho double is obviously double the size and should save more digits.

printf() 中将 float 作为 ... 参数传递时,它首先被提升为 double"%f"double 打印到 ..

后的四舍五入的 6 位

由于四舍五入到小数点后 6 位时原始值没有差异,因此它们看起来相同。

What am i doing wrong?

期望默认精度6是不够区分的。


最容易看出与 "%a" 的不同。

printf("%a\n", 1.2222222222222222);
printf("%a\n", 1.2222222222222222f);

0x1.38e38e38e38e3p+0
0x1.38e38ep+0

或以指数表示法有足够的小数位。

printf("%.*e\n", DBL_DECIMAL_DIG - 1, 1.2222222222222222);
printf("%.*e\n", DBL_DECIMAL_DIG - 1, 1.2222222222222222f);

1.2222222222222221e+00
1.2222222089767456e+00