前阵子自己鼓捣个小程序算账,图省事钱数全用float存。跑出来一对,嚯,100减3.5等于96.499999… 我当场懵圈。查半天才搞明白,电脑里小数是按二进制存的,像0.1这种压根是无限循环小数,存进去就丢精度,加减几轮越错越离谱。
卧槽
后来学乖了,算钱一律用整数分来记,显示再除一百。还有比较浮点数千万别写==,得看俩数差是不是小于个极小值,不然你那判断八百年不触发,debug到头秃哈哈。哈哈
你们平时都咋绕开这坑的,有更省心的写法不
前阵子自己鼓捣个小程序算账,图省事钱数全用float存。跑出来一对,嚯,100减3.5等于96.499999… 我当场懵圈。查半天才搞明白,电脑里小数是按二进制存的,像0.1这种压根是无限循环小数,存进去就丢精度,加减几轮越错越离谱。
卧槽
后来学乖了,算钱一律用整数分来记,显示再除一百。还有比较浮点数千万别写==,得看俩数差是不是小于个极小值,不然你那判断八百年不触发,debug到头秃哈哈。哈哈
你们平时都咋绕开这坑的,有更省心的写法不
我早些年也在这坑里扑腾过,对着屏幕怀疑人生了半天。其实现在很多语言都自带 decimal 类型,专治算钱这种场景,比手动记整数分要省心些,就是别拿它跑特别密集的循环,会慢那么一截。
看到96.499999…那一串,像忽然瞥见灯下的一道裂缝。我们以为算得清的,到头来都差着一丝补不回的尾数。要紧的账目,我后来也用最笨的法子,一厘一厘数,反倒睡得安稳了。
我之前自己瞎鼓捣个记账的小玩意儿也踩过,对着96.499999发呆半天。后来老老实实整数分记,省心多了
==八百年不触发这句太真实 我头回写那判断死活不进 对着屏幕愣了半天 后来才晓得要比个极小值才行
整数分记账最稳当。想更省心直接上decimal类型,Python的decimal模块、Java的BigDecimal都行,格式化留给显示层处理就行
我刚鼓捣小程序那阵子也撞过这坑,对着 96.499999 愣了半天,还以为自己减法按错了。不过你既然已经改用整数分记账了,钱数那块连那个极小值都不用比,整数相等直接==就稳,反而比浮点清爽多了。
这精度坑太隐蔽了,100减3.5蹦出96.499999谁顶得住。整数分记法genau,我后来也乖乖改了
这坑我也在别处栽过,上次帮人算活动经费零头怎么都对不上,还以为自己手残。整数分记账这招稳,回头就改过来!
100减3.5蹦出96.4999,谁第一眼不懵。我当初还以为自己算术退化了。整数分记账真香,倒是想问比较浮点你取多小eps?我总怕取大了翻车。
96.499999给我看乐了 这坑我也栽过 debug到头秃真的 后来全改整数分 省心多了
楼主说按分记账我太熟了,我家以前做生意账本全是整数,分分厘厘清清楚楚。==比浮点那种坑真能把人整崩溃
Genau! 我也被这坑咬过,拿float记账对不上那叫一个懵。其实很多语言自带decimal,比自己乘一百省事。