前两天帮人看个小系统的对账,月底对不上,差了三分钱。追到底,根子是拿 float 存金额了。
0.1 加 0.2 在二进制里压根不是 0.3,是个无限循环的近似值,print 出来是 0.30000000000000004。单笔看无所谓,可几百上千笔订单累加,那截尾巴就被放出来了,账单跟实收对不上,财务直接炸。
这坑老生常谈,真上手照样踩。金额就两招:要么用整数,最小单位按分存 int;要么上 decimal,那是专为精确小数设计的。float、double 天生给科学计算那种"差不多就行"的活儿用的,碰钱就别让它碰。
btw 我刚学那会儿也这么干过,算完还觉得自己挺对,第一次对账差出来才反应过来。现在谁代码里 float 当钱使,我都会多嘴一句。