float精度上限约7位有效数字,但仅前6位稳定可靠,因其32位IEEE 754格式中23位尾数加隐含1位共24位二进制,log₁₀(2²⁴)≈7.22,工程实践保守保证6位。

float 的精度不是“小数点后几位”,而是“总共能准确表达多少位有效数字”。 它的精度上限是约 7 位,但稳定可靠的只有前 6 位——超出的部分可能被舍入、截断,甚至完全失真。
为什么是 6–7 位有效数字?
这由 IEEE 754 单精度浮点格式决定:float 占 32 位,其中 23 位用于存储尾数(即“有效数字部分”)。虽然隐含一位“1.”,实际可表示约 log₁₀(2²⁴) ≈ 7.2 位十进制数字,但工程实践中只保证前 6 位绝对不丢。例如:
- 123456.789f 和 123456.789123456f 存入 float 后,输出都是 123456.79(第 7 位开始已四舍五入)
- 10000001f 实际存储为 10000000f(第 8 位无法承载,末位归零)
有效数字 vs 小数位数
很多人误以为 float 能精确到小数点后 6 位,其实不然。它的精度是按“从左起第一个非零数字开始数”的有效位来算的:
- 0.0001234567f → 有效数字共 7 位(1234567),但第 7 位(7)很可能不准
- 9876543.2f → 表示成科学计数法约为 9.876543 × 10⁶,最多保留前 6 位(987654),末位已浮动
- 一旦数值超过 2²⁴(约 16777216),相邻两个可表示的 float 值之间间隔 ≥ 2,整数都无法一一对应
什么时候会明显出问题?
以下场景中,6 位精度容易暴露误差:
- 做多次累加(如统计千万级传感器数据总和)
- 比较两个理论上相等的计算结果(
a == b很可能为 false) - 金融计算(分币单位要求精确到 0.01,而 0.1f 本身就不精确)
- 坐标或物理模拟中长期迭代(误差随步数指数放大)
怎么验证当前值是否在安全精度内?
简单方法:用 String.format("%.6g", x) 输出,若前后两次不同输入得到相同字符串,说明已超出 float 的分辨能力;更稳妥的做法是——
- 需要精确小数运算(如金额)→ 改用
BigDecimal - 需要更高精度中间计算 → 直接用
double(15–16 位) - 必须用 float(如 OpenGL 坐标、Android Canvas)→ 接受误差,避免等值判断,改用
Math.abs(a - b)

















