You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 00:03:29