绝大多数情况下选 double,只有明确知道 float 足够用且有硬性约束时才换 float;float 最多稳定保留 6–7 位有效数字,double 为 15–16 位,精度差异决定适用性。

直接说结论:绝大多数情况下选 double,只有明确知道 float 足够用、且有硬性约束时才换 float。
精度差异决定是否“能用”
float 最多稳定保留 6–7 位有效数字,double 是 15–16 位。这不是“小数点后几位”的问题,而是整个数字的可靠位数。
- 比如存 1234567.89:float 可能变成 1234567.9(第 7 位起失真),double 通常能保持到 1234567.8900000002
- 连续做加法、开方、sin/cos 等运算时,float 的误差会快速累积;double 能把误差压制在 1e−15 量级,实际中基本可忽略
- 地理坐标(经纬度)、物理仿真参数、机器学习权重——这些值本身带多位小数,且参与大量迭代,float 容易漂移
内存与性能不是主要瓶颈
现代 CPU 处理 double 和 float 的速度差距已极小,真正卡顿往往来自算法或 I/O,而非浮点类型本身。
- float 占 4 字节,double 占 8 字节——单个变量几乎无感;但若定义百万级浮点数组,内存差一倍(比如图像像素缓冲)
- GPU 图形管线(如 OpenGL/Vulkan)普遍用 float,因硬件专为单精度优化,且顶点坐标、颜色值对精度要求不高
- 嵌入式设备(如传感器节点、MCU)内存紧张时,float 才是合理选择;通用服务器或 Android/iOS 应用无需为此妥协
语言默认与写法细节不能忽略
Java、C/C++、C# 中,所有小数常量默认是 double,这是关键陷阱。
-
float f = 3.14;→ 编译报错;必须写成float f = 3.14f; - 混合计算时,float 会自动提升为 double 再运算——全程用 double 反而更干净,避免隐式转换和意外降精度
- 金融计算不适用 float/double:0.1 在二进制中本就不能精确表示,两者都存在误差,只是 double 更小;务必用
BigDecimal或整数分单位处理
比较和判断要换思路
无论 float 还是 double,都不能用 == 判断相等,因为存储本质是近似值。
- 正确做法是设定容差:
Math.abs(a - b) (double)或 <code>Math.abs(a - b) (float) - 容差值不是随意定的:它应略大于该类型可能产生的最大舍入误差,double 一般取 1e−10~1e−12,float 取 1e−5~1e−6
- 涉及范围判断(如
a > 0.5)相对安全,但累加后判断阈值仍建议预留余量











