上一篇
小明最近开发了一个电商系统,某天财务怒气冲冲地来找他:"你们的系统有问题!用户支付100元,我们实际只收到99.99元,那1分钱去哪了?"小明检查代码后发现,问题出在一个简单的计算上:
total = 100.0 fee = total * 0.0001 # 万分之一手续费 print(total - fee) # 输出99.99000000000001
这多出来的0.00000000000001是哪来的?这就是我们今天要聊的浮点错误。
计算机存储数字和我们人类不一样,我们写3.14,计算机其实是用二进制近似表示这个数,就像近视眼不戴眼镜看东西——能认出来,但不完全准确。
浮点数在计算机中的存储方式就像科学计数法,由三部分组成:
以64位双精度浮点数为例,它只能精确表示15-17位十进制数,所以当你看到:
1 + 0.2 == 0.3 # 返回False
别惊讶,因为:
print(0.1 + 0.2) # 输出0.30000000000000004
double salary = 9999.99; double bonus = salary * 0.1; // 实际得到999.9989999999999
let sum = 0; for(let i=0; i<10; i++) { sum += 0.1; } console.log(sum); // 不是1.0,而是0.9999999999999999
if (fabs(result - expected) < 0.000001) { // 应该用这种方式比较浮点数 }
rounded = round(0.1 + 0.2, 2) # 0.3
// 用分而不是元计算 let total = 10000; // 100元=10000分 let fee = Math.floor(total * 0.0001); // 1分
Python的decimal
模块:
from decimal import Decimal print(Decimal('0.1') + Decimal('0.2')) # 精确输出0.3
Java的BigDecimal
:
BigDecimal a = new BigDecimal("0.1"); BigDecimal b = new BigDecimal("0.2"); System.out.println(a.add(b)); // 0.3
这就像用3个2的分数表示1/10:
所以0.1在二进制中是无限循环小数:0.00011001100110011...
2025年初,某证券交易所系统因为浮点误差累计,导致每100万笔交易就丢失1元,运行一个月后,总误差达到47万元,引发监管调查,最后发现是使用了浮点数计算手续费导致的。
下次当你看到财务系统少了一分钱,先别怀疑有人贪污,很可能只是浮点误差在作怪!
本文由 沐颖馨 于2025-08-01发表在【云服务器提供商】,文中图片由(沐颖馨)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/503743.html
发表评论