int: 用于表示整数(没有小数点)。float: 用于表示单精度浮点数(即带有小数点的近似值)。double: 用于表示双精度浮点数(比float精度更高、范围更广的近似值)。
下面我们从多个维度进行详细的对比。

(图片来源网络,侵删)
核心区别总结表
| 特性 | int (整数) |
float (单精度浮点数) |
double (双精度浮点数) |
|---|---|---|---|
| 数据类型 | 整型 | 浮点型 | 浮点型 |
| 表示范围 | -2,147,483,648 到 2,147,483,647 (32位系统) | 约 ±3.4 x 10±38 | 约 ±1.7 x 10±308 |
| 精度 | 精确(只要在范围内) | 约 6-7 位有效数字 | 约 15-16 位有效数字 |
| 内存大小 | 通常为 4 字节 (32位) | 通常为 4 字节 (32位) | 通常为 8 字节 (64位) |
| 格式化输出 | %d 或 %i |
%f |
%lf |
| 后缀 | 无 (如 123) |
f 或 F (如 14f) |
l 或 L (如 14159L) |
| 用途 | 计数、索引、年龄、数量等科学计算、金融、需要高精度的场景 | 图形学、物理模拟等需要大范围但精度要求不高的场景 |
详细解释
int (Integer - 整数)
int 是最基本、最常用的数据类型,用来存储没有小数部分的整数。
- 精度:
int是精确的,只要数字在它的表示范围内,它就能被完美存储,不会丢失任何信息。100和1000000存储为int都是精确的。 - 范围:范围是有限的,在大多数现代系统(32位或64位)上,
int是32位的,可以表示从 -2,147,483,648 到 2,147,483,647 之间的整数,如果超出这个范围(称为“溢出”),结果就会是未定义的,通常是错误的。 - 示例:
int age = 30; int numberOfStudents = 1024; int temperature = -10; // 冬天的温度
float (Single-Precision Floating-Point - 单精度浮点数)
float 用来存储带有小数的数字,但它是一种近似值,而不是精确值。
- 精度:
float是不精确的,它用 32 位内存来存储一个数字,其中一部分用于存储指数(决定小数点的位置),一部分用于存储尾数(决定有效数字),这导致它能表示的数字范围很大,但精度有限,通常只有 6 到 7 位有效数字。- 什么是有效数字?
1415926如果存为float,可能只能精确存储前 7 位,变成141593,再比如0存为float,可能会变成0,因为后面的数字超出了精度范围。
- 什么是有效数字?
- 范围:范围比
int大得多,可以表示非常大或非常小的数字。 - 示例:
float pi = 3.141592f; // 注意 f 后缀,告诉编译器这是一个 float float price = 19.99f; float scientific = 1.23e10f; // 1.23 * 10^10
double (Double-Precision Floating-Point - 双精度浮点数)
double 是 float 的增强版,它使用 64 位内存来存储浮点数,提供了更高的精度和更大的表示范围。
- 精度:
double也是不精确的,但精度比float高得多,通常有 15 到 16 位有效数字,对于绝大多数科学计算和工程应用来说,这个精度已经足够了,如果你需要存储14159265358979323846,使用double可以存下更多位数。 - 范围:范围比
float更大,可以表示更大或更小的数字。 - 示例:
double precisePi = 3.141592653589793; // 没有 f 后缀,默认是 double double distance = 150000000000.0; // 地球到太阳的平均距离(公里) double verySmall = 1.23e-20; // 1.23 * 10^-20
关键区别深入剖析
内存占用与性能
int: 4 字节float: 4 字节double: 8 字节
这意味着一个 double 变量占用的内存是一个 int 或 float 的两倍。

(图片来源网络,侵删)
在性能方面:
- 整数运算 (
int) 通常比浮点数运算快得多,因为 CPU 有专门针对整数运算的优化指令。 - 浮点数运算 (
floatvsdouble):在现代 CPU 上,float和double的运算速度可能相差不大,因为 64 位 CPU 通常能一次性处理 64 位(即double)的数据,但在一些旧的或嵌入式系统上,float运算可能会更快,因为它占用的带宽和缓存更少。总体原则:在精度满足要求的前提下,优先使用float以节省内存和潜在的带宽。
精度问题(非常重要!)
这是浮点数(float 和 double)最需要注意的地方。永远不要用 来直接比较两个浮点数是否相等!
由于它们是二进制的近似表示,很多十进制小数在二进制中是无限循环小数,无法被精确表示。1 在二进制中是一个无限循环小数。
#include <stdio.h>
int main() {
float a = 0.1f;
float b = 0.2f;
float sum = a + b;
// 你期望 sum == 0.3,但实际结果可能不是精确的
if (sum == 0.3f) {
printf("sum is equal to 0.3\n"); // 这行可能不会执行!
} else {
printf("sum is NOT equal to 0.3. It is: %f\n", sum); // 更可能发生的情况
}
// 正确的比较方法是判断它们的差值是否在一个很小的“误差范围”内
float epsilon = 0.00001f;
if ((sum - 0.3f) < epsilon && (0.3f - sum) < epsilon) {
printf("sum is approximately equal to 0.3\n");
}
return 0;
}
格式化输出 (printf)
这是初学者常犯的错误。

(图片来源网络,侵删)
- 打印
int:使用%d或%i。 - 打印
float或double:都使用%f。 - 特别注意:在
scanf函数中,读取double类型时必须使用%lf,否则会导致行为未定义(通常是读取错误),但在printf中,打印double可以用%f或%lf,%f更常见。
#include <stdio.h>
int main() {
int i = 10;
float f = 3.14f;
double d = 3.1415926535;
printf("int: %d\n", i); // 正确
// printf("int: %f\n", i); // 错误!格式不匹配
printf("float: %f\n", f); // 正确
printf("double: %f\n", d); // 正确,打印 double 用 %f 是标准做法
double value;
printf("Enter a double: ");
scanf("%lf", &value); // 正确!读取 double 必须用 %lf
// scanf("%f", &value); // 错误!
return
