C语言中double与float打印值相同?π值输出精度为何未达预期?
问题1:为何C语言中double与float内存大小不同,但打印值却相同?
问题2:使用π计算时,M_PI仅能打印7位小数,自定义MY_PI后仍存在相同问题——double类型本应支持15-17位十进制精度,却只输出6位小数?
用户代码:
#define MY_PI 3.1415926535897932384626433832795028841971 #include<stdio.h> #include<math.h> int main() { printf("%f\n%lf\n%20lf\n",M_PI,M_PI,M_PI); printf("%d\n%d\n",sizeof(float),sizeof(double)); printf("%f\n%lf\n%20lf\n",MY_PI,MY_PI,MY_PI); return 0; }
运行结果:
3.141593 3.141593 3.141593 4 8 3.141593 3.141593 3.141593 Process returned 0 (0x0) execution time : 0.080 s Press any key to continue.
问题解答
1. double与float内存不同但打印值相同的原因
- float是32位单精度浮点数,有效精度约6-7位十进制数字;double是64位双精度浮点数,有效精度约15-17位。两者存储容量和精度上限有差异,但默认打印格式掩盖了这种差异。
- 你使用的
%f/%lf格式符,默认只输出6位小数。π的前6位小数(3.141593)在float的精度覆盖范围内,所以float和double类型的π用默认格式打印时,结果看起来一致。 - 若要看到差异,只需指定更多小数位打印:
此时就能明显看到两者的精度区别。float pi_f = M_PI; double pi_d = M_PI; printf("%.10f\n", pi_f); // 输出3.1415927410 printf("%.10lf\n", pi_d); // 输出3.1415926536
2. double类型π只输出6位小数的原因
- 这是
printf的默认规则:%f/%lf格式符默认仅保留6位小数,和double本身的精度无关。double的15-17位精度是指它能存储的有效数字上限,不是默认打印的小数位数。 - 要输出更多小数位,需手动指定精度,比如用
%.15lf输出15位小数,%.17lf输出接近double最大精度的数值:
运行后会输出:printf("%.17lf\n", M_PI); printf("%.17lf\n", MY_PI);3.14159265358979312 3.14159265358979312 - 另外,你定义的
MY_PI字面量会被C语言默认当作double类型处理,它的精度最终受限于double的存储能力——无法完全存储你写的所有小数位,double最多只能精确表示约17位有效数字。
内容的提问来源于stack exchange,提问作者EMS
相关产品推荐
相关产品推荐

