优先使用 double,仅在明确 float 精度足够且内存/硬件受限时选用;float 有效数字 6–7 位,double 15–16 位;Java 中字面量默认为 double,float 需加 f 后缀;浮点比较须用误差阈值而非 ==。

绝大多数情况下直接用 double,只有在明确知道 float 精度够用、且内存或硬件有硬性限制时,才换 float。
精度差异不是“小数点后几位”,而是有效数字位数
float 最多稳定保留 6–7 位有效数字,double 是 15–16 位。这不是看小数点后有几位,而是整个数字从第一个非零位开始算的可靠位数。
- 比如存
1234567.89:float 可能变成1234567.9(第 7 位起失真),double 通常能保持到1234567.8900000002 - 像
0.123456789这样的字面量,float 输出是0.12345678,double 才能接近原值 - 多次加减、开方、sin/cos 运算后,float 的误差会快速放大;double 的误差一般压在 1e−15 量级,日常几乎可忽略
Java 默认浮点类型是 double,float 必须显式声明
这是新手最常踩的坑:所有带小数点的字面量(如 3.14、0.1)在 Java 中默认就是 double 类型。
-
float f = 3.14;→ 编译报错:不能把 double 赋给 float - 正确写法是
float f = 3.14f;或float f = (float)3.14;(不推荐强转,易丢精度) - double 可省略后缀:
double d = 3.14;、double d = 3.14d;都合法
适用场景怎么选,看实际需求而非理论
别被“float 更快”“float 更省”带偏——现代 CPU 和 JVM 对 double 的支持已非常成熟,单个变量的性能差几乎为零。
立即学习“Java免费学习笔记(深入)”;
- 优先用 double:地理坐标(经纬度)、物理仿真、机器学习权重、通用业务逻辑中的小数运算
- 可考虑 float:OpenGL/Vulkan 图形管线(顶点、颜色值对精度要求低)、嵌入式设备(MCU 内存紧张)、百万级像素缓冲等大规模数组场景
- 金融计算慎用两者:该上
BigDecimal就上,double 仅适合中间过程且误差可接受的高性能场景
比较浮点数永远别用 ==,必须用误差阈值
因为 0.1 在二进制中无法精确表示,float 和 double 都存在固有误差,只是 double 更小。
- 错误写法:
if (x == y) - 正确写法:
if (Math.abs(x - y) < 1e-10)(double 用 1e−10,float 可放宽到 1e−5) - 注意:阈值大小要匹配你使用的类型和业务容忍度,不是越小越好


















