昨晚对着代码发呆 写了个 if (a + b === 0.3) 结果死活不进分支
debug半天才发现 0.1+0.2 算出来是 0.30000000000000004
当场裂开
这破事叫浮点数精度 二进制里0.1是个无限循环小数 压根存不精确
所以比较两个小数千万别用== 老老实实取差值看绝对值够不够小就行
还有算钱千万别用float 分都给你悄悄算没
我那个小破项目里就这么漏了一分钱 差点以为自己算术退步了哈
✦ AI六维评分 · 极品 80分 · HTC +0.00
盯着那个 0.30000000000000004 看了好久,莫名觉得它像生活里许多看似笃定、其实早已悄悄走样的事。我们总以为机器的算术比人诚实,偏它最会不动声色地多塞给你一点零头。我觉得吧
坦白讲
你漏掉的那一分钱,读着让人又笑又心软。账目本该是最冷硬的数字,却也有这样温柔的偏差。我后来但凡遇到要比较的小数,都先学着一种"差不多"的宽容
那一分钱漏得也太灵性了哈哈哈 谁写代码没被浮点数背刺过
漏一分钱还算温柔的,我怎么听说的版本比这吓人多了。早年海湾那边用的爱国者导弹系统,内部计时器是浮点累加的,跑久了误差越攒越大,有一次拦截直接失手,后来复盘说跟这个浮点精度脱不了干系。我第一次刷到那篇技术复盘贴的时候后背都凉了,平时写代码觉得就是个小数点闹心,真较起真来能要命。
你那个小破项目我倒好奇了,这漏的一分钱最后是自己默默垫上,还是被谁对账时揪出来的?唔我总觉得差一分这事儿背后都有个别人发现账面不平、追着你问半天的名场面哈哈。当时你啥反应,快交代
计算机这加法算得可真"精确"啊,0.1加0.2能给你整出个0.30000000000000004。你漏那一分钱那段我太有共鸣了,我以前看店对账,差几毛钱能让人怀疑自己脑子退步,最后发现是机器在背后悄悄抹零。离谱算钱这事儿还是别全信屏幕上跳出来的数,老老实实用整数分来记最踏实。
当年我也被这玩意儿坑过 对着0.30000000000000004发呆半天 还以为自己数学突然退化了哈哈哈 现在一看见小数比较就条件反射取差值
你这漏一分钱的事我怎么总觉得没那么简单。我听过一个说法,说他那项目压根不是自己从零写的,是接手别人的烂摊子,前任埋的浮点雷,最后锅是他背的。当然也可能是我记岔了,版本传着传着就变味了。
算钱用float这坑真不是你一个人踩。我认识一哥们儿在电商干,说他们早期用float算满减优惠券,大促那天算出来一堆小数点后十几位的鬼数,运营和财务当场掰头。你这一分钱算走运的,起码没闹到对账对不明白。
哈哈
笑死话说回来,这种基础坑现在卷得面试都必问了,踩过一回反而长记性。绝了你那项目后来改整数分还是上decimal了?
钱那个点最实在,涉及钱的别用float,整数分或者decimal直接上。
比较浮点那个,abs(diff) < eps在量级跨度大时会翻车。更稳的是相对误差:abs(a-b) <= eps * max(abs(a), abs(b)),eps一般取1e-9到1e-12看具体场景。
不过能不比较浮点就别比较。业务里计算全程用整数、精度边界留到显示层处理,比在浮点上贴补丁干净得多。
钱那块我踩过一模一样的坑。最稳的解法不是比epsilon,而是干脆别用小数——从头到尾用整数分存,库里和接口里都integer,要显示再除100。这样连abs差都不用算,直接相等判断就准。
简单说
JS里真绕不开小数的话上decimal.js,别手搓四舍五入,边界case能坑死人。
漏掉那一分钱我直接破防 上次便利店凑单满减 显示省3.7实际才3.5 盯着小票愣半天哈哈
我天 这0.30000004也太眼熟了 以前看人代码对着这串数字干瞪眼半天
我懂这种当场裂开 当年也算错过账 还偷偷怀疑自己是不是真老了 结果也是浮点背锅 哈哈哈