在线计算器在极少数情况下可能因浮点运算——计算机以二进制存储小数的方式——而产生略微错误的答案。 对于绝大多数日常计算,结果是精确的。例外情况是特定的、可预测的,一旦知道要注意什么,就很容易发现。
为什么浮点运算不总是精确的
你输入的每个数字都以 64位双精度浮点数 形式存储——这是由IEEE 754标准定义,所有主流浏览器都遵循该标准。该格式能准确表示大约15到17位有效十进制数字。对于大多数计算,这种精度绰绰有余。
问题出现在没有精确二进制等价的小数分数上。十进制的0.1在二进制中是循环小数——类似于十进制中1/3是0.333...,没有干净的终止点。计算器存储的是最接近的可表示值,这就引入了微小的舍入误差。多个此类分数相加时,这些误差会累积。这就是为什么在浏览器控制台输入0.1 + 0.2返回的是0.30000000000000004而不是0.3的原因。
你什么时候会注意到差异,什么时候不会
大多数舍入误差非常微小,实际中几乎看不见:
- 整数——大约9千万亿(2⁵³)以内的整数能被精确表示,完全没有舍入误差。
- 简单分数且十进制结果整洁——
1 ÷ 4 = 0.25是精确的,因为0.25有干净的二进制表示。 - 短链的十进制运算——小费计算或单位换算几乎不会出现足够大的误差。
- 长链的十进制加法——多次相加如0.1、0.3或0.7时,舍入误差会累积,尤其当结果与精确值对比时更明显。
- 相近数的减法——
1000001 − 1000000.9可能产生比预期更多的噪声,因为大部分精度被用来表示两个数本身。
上方计算器在显示前将中间结果四舍五入到小数点后10位,这掩盖了大部分误差。底层计算仍使用完整双精度(约15-17位),显示舍入让结果在日常使用中看起来更干净。
如何验证你不确定的结果
- 先估算——快速的心算估算能立即发现大错误。如果计算器显示450,但你估算约为4500,说明输入有误,而非运算错误。
- 换个方向重新计算——如果你用A除以B得C,试着用C乘以B,看是否回到A。
- 精度重要时用整数——涉及分的财务计算时,使用整数(例如全部乘以100)而非小数,最后再转换。
- 对微小尾数保持怀疑——像
2.9999999998这样的结果几乎肯定意味着数学上精确答案是3;差异是浮点误差造成的。
亲自试试:在上方计算器输入0.1 + 0.2。显示为0.3——舍入步骤掩盖了浮点误差。对于绝大多数任务,这样干净的显示就足够了。