C/C++ 中,float 和 double 都是浮点类型,用于表示带小数的数字。它们的主要区别在于 精度 和 存储大小。float 在精度上比 double 差,尤其是在小数点后多位数的表示上。double提供了更高的精度和更大的范围,但会占用更多的内存空间。float则相反,精度和范围较低,但占用更少的内存空间。

1、基本定义

float 通常占用 4 字节(32 位),约为 6-7 位有效数字,采用 IEEE 754 标准单精度浮点格式,1 位符号位,8 位指数位,23 位尾数位。

double 通常占用 8 字节(64 位),约为 15-16 位有效数字,采用 IEEE 754 标准双精度浮点格式,1 位符号位,11 位指数位,52 位尾数位。

类型

大小

精度

有效数字

指数范围

float

4 字节

6-7 位有效数字

7 位左右

-38 到 38

double

8 字节

15-16 位有效数字

16 位左右

-308 到 308

2、精度差异

float 适用于存储不需要极高精度的数据,比如图形处理、游戏中的坐标计算等。double 适用于对计算精度要求较高的场景,如科学计算、工程计算、金融计算等。

#include <stdio.h>

int main() {
    float f = 1.123456789;
    double d = 1.123456789;
    
    printf("float: %.9f\n", f);  // 输出:1.123456800
    printf("double: %.9f\n", d); // 输出:1.123456789

    return 0;
}

3、性能差异

float 占用内存较小,运算速度快(尤其在某些硬件上,如 GPU、嵌入式系统)。double 占用内存较大,但对于多数现代 CPU,double 计算并不会比 float 慢太多(尤其是具有硬件浮点运算支持的情况下)。如果性能至关重要且对精度要求不高,使用 float。如果需要较高的计算精度,使用 double

1)浮点累加误差(精度对比)

#include <stdio.h>

int main() {
    float f_sum = 0.0f;
    double d_sum = 0.0;

    for (int i = 0; i < 1000000; i++) {
        f_sum += 0.000001f;
        d_sum += 0.000001;
    }

    printf("float  sum: %.10f\n", f_sum);
    printf("double sum: %.10lf\n", d_sum);

    return 0;
}

2)科学计算/金融(double)

在需要高精度的科学模拟或金融运算中,double 更合适。

// 计算复利(double 精度)
#include <stdio.h>
#include <math.h>

int main() {
    double principal = 10000.0;
    double rate = 0.05;
    int years = 30;

    double amount = principal * pow(1 + rate, years);
    printf("Future Value (double): %.10lf\n", amount);

    return 0;
}

3)嵌入式开发(float)

在资源受限的嵌入式系统(如 STM32 等 ARM Cortex-M 处理器)中,为了减少内存和计算负担,使用 float 更合适。

#include <stdio.h>

int main() {
    // 模拟采集到的 4 个温度值(单位:摄氏度)
    float temperatures[] = {23.1f, 23.3f, 22.8f, 23.0f};
    float sum = 0.0f;

    // 累加所有温度值
    for (int i = 0; i < 4; i++) {
        sum += temperatures[i];
    }

    // 计算平均温度
    float avg = sum / 4;

    // 输出结果(保留 2 位小数)
    printf("Average temperature: %.2f°C\n", avg);

    return 0;
}