double 是 Java 中首选的浮点数类型,而 float 主要用于节省内存的特殊场景。
下面我们从几个核心维度进行深入对比。
核心区别一览表
| 特性 | float (单精度浮点数) |
double (双精度浮点数) |
|---|---|---|
| 存储大小 | 32 位 (4 字节) | 64 位 (8 字节) |
| 精度 (有效数字) | 大约 6-7 位 十进制有效数字 | 大约 15-16 位 十进制有效数字 |
| 指数范围 | 较小 | 较大 |
| 默认类型 | 不是 默认类型,必须加 f 或 F |
是 默认类型,小数常量默认是 double |
| 性能 | 在某些旧硬件上可能更快,但现代 JVM 优化后差异不大 | 通常与 float 性能相当,甚至在某些计算中更快 |
| 应用场景 | 内存敏感的场景(如 Android 开发)、图形学 | 绝大多数情况下的首选,科学计算、金融等 |
精度和范围
这是两者最根本、最重要的区别。
精度
精度指的是浮点数能够表示的有效数字的位数。
float: 精度大约为 6-7 位,这意味着当你用float来存储一个像1415926535这样的数时,它可能只能精确表示前 7 位,后面的数字就不准确了。double: 精度大约为 15-16 位,它的精度是float的两倍多,足以满足绝大多数高精度计算的需求。
示例代码:

public class FloatDoublePrecision {
public static void main(String[] args) {
float f = 123.456789123456789f; // 注意末尾的 f
double d = 123.456789123456789;
System.out.println("Float value: " + f);
System.out.println("Double value: " + d);
}
}
输出结果:
Float value: 123.45679
Double value: 123.45678912345678
分析:
floatf只保留了大约 7 位有效数字,45679。doubled保留了更多位数,45678912345678,精度远高于float。
范围
范围指的是浮点数能够表示的最大值和最小值(指数部分决定)。
float的范围大约是±3.40282347E+38。double的范围大约是±1.7976931348623157E+308。
double 的范围比 float 大得多得多,在绝大多数应用中,float 的范围已经足够,但 double 提供了更大的“安全边际”。

内存占用
float占用 32 位(4 字节) 的内存。double占用 64 位(8 字节) 的内存。
这意味着一个 double 变量占用的内存空间是一个 float 变量的两倍。
何时考虑 float 的内存优势?
当你在处理海量数据时,内存占用就变得至关重要。
- Android 开发:在移动设备上,内存非常宝贵,使用
float可以有效减少应用的内存占用。 - 大型游戏或图形渲染:当有成千上万个顶点坐标需要存储时,使用
float可以显著降低内存占用,提高缓存命中率,从而提升性能。 - 机器学习中的大型矩阵:在处理大规模数据集时,将
double替换为float可以将内存需求减半。
默认类型和字面量
这是一个非常常见的初学者陷阱。
在 Java 中,任何带小数点的数字字面量(如 5)都被默认视为 double 类型。

如果你想把一个字面量赋值给 float 变量,编译器会报错,因为从 double 到 float 的隐式转换可能会丢失精度。
错误示例:
// 这行代码会编译失败! float f = 10.5; // 错误信息: incompatible types: possible lossy conversion from double to float
正确的做法:
你必须在数字字面量后面加上 f 或 F 后缀,告诉编译器这是一个 float 类型的字面量。
float f = 10.5f; // 正确! float f2 = 10.5F; // 正确,F 和 f 都可以
对于 double,你可以选择加 d 或 D,但这是可选的。
double d = 10.5; // 正确,默认就是 double double d2 = 10.5d; // 正确,显式声明
性能
这个问题在过去和现在有不同的答案。
- 过去(在旧硬件上):在早期,CPU 的浮点单元对
double的支持不如float高效,处理double的速度更慢,在性能极度敏感的场景下,开发者会选择float。 - 在现代 JVM 和硬件上):情况已经发生了巨大变化,现代的 CPU 和 JVM 对
double的优化非常好,在大多数情况下,float和double的运算性能几乎没有差别,JVM 甚至会自动将float运算优化为double运算,因为现代 CPU 处理double的速度也很快。
不要为了“可能”的性能提升而盲目使用 float。 除非你明确知道自己在做什么(例如在上述内存敏感的场景中),否则应该优先使用 double。
何时使用 float,何时使用 double?
首选 double (除非你有充分的理由)
- 默认选择:当你需要处理小数时,总是先考虑
double。 - 需要高精度:金融计算(虽然金融领域更推荐使用
BigDecimal)、科学计算、工程计算等。 - 通用业务逻辑:大多数企业级应用的后端计算。
考虑使用 float
- 内存是首要考虑因素:如上面提到的 Android 开发、游戏开发、大型数据集处理。
- 数据存储:当数据存储空间受限时(某些网络协议或文件格式)。
- 你确定数值范围和精度足够:表示屏幕坐标、颜色分量(RGBA)等,
float的精度就绰绰有余。
| 何时选择... | 理由 |
|---|---|
double |
默认选项,精度更高(15-16位),范围更大,能满足绝大多数需求。 |
float |
内存受限的场景,当内存占用比精度更重要时,选择 float(32位,6-7位精度)。 |
记住这个核心原则:除非你明确知道需要节省内存并且 float 的精度足够,否则总是使用 double。 这能帮你避免很多潜在的精度问题和类型转换错误。
