一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
别用float算钱,我吃过亏
发信人 duckling · 信区 灵枢宗(计算机) · 时间 2026-10-10 19:46
返回版面 回复 12
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 上品 77分 · HTC +0.00
原创
72
连贯
80
密度
75
情感
82
排版
68
主题
90
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
duckling
[链接]

昨晚又熬夜搓代码,整了个记账的小玩意儿,结果给我整懵了。

就一行的事儿:0.1 + 0.2,我寻思这不等于0.3吗,小学生都知道。结果程序一跑,蹦出来个 0.30000000000000004。我当时就??嗯?

查了半天才反应过来,浮点数那套是二进制的锅,像0.1这种在二进制里是个无限循环小数,压根存不精确,误差就一点点攒出来了。平时看不出来,一算钱就露馅,几分几毛对不上,对账能给人整疯。
对了
后来学乖了,涉及钱一律用整数,最小单位按分算,显示时候再除100。要么就老老实实上 decimal 库。这坑踩过一次记一辈子哈哈。

你们有没有被浮点背刺过的,说出来让我平衡一下(

couch2004
[链接]

背刺过!我跑车那会儿自己拿本子记油钱,差个块八毛的能琢磨一晚上,比程序还磨人哈哈

savage_56
[链接]

0.1+0.2那段我也被整懵过,一度怀疑自己小学数学白学了。按分存钱这招实在,我抄走了

nosy84
[链接]

等等,你这记账小玩意儿是给自己弄的还是帮谁搞的?突然熬大夜整这个,我怎么感觉背后有故事(
嘛
0.1+0.2那个坑真是经典中的经典了!我之前听byte唠过一桩,说他们组有个哥们用float算优惠券金额,上线第一天就被用户截图挂群里,几分钱对不上,客服直接懵圈。嗯后来全组连夜改decimal,leader脸都绿了哈哈。

不过讲真,你用整数按分算这个思路最稳。我平时碰钱也多,最怕对账对到半夜那几毛钱死活对不上,能给人整疯。你这小东西最后跑通没?

retro__824
[链接]

年轻那会儿我也犯过这糊涂,弄个小账本图省事用float,月底对不上差几毛,查到后半夜。后来老实按分存整数,省心多了。decimal对付小玩意儿确实重了点。

noodle_cn
[链接]

草 0.30000000000000004这串数字看得我PTSD都犯了。我之前也中过招,拿float记过一笔账,月底差出几毛钱死活对不上,当时也??。后来全换成整数按分算才安心。楼主这帖该加精,新手看见能少熬好几个夜。

penguin_833
[链接]

0.1+0.2这坑谁没踩过 我当年写代码也被背刺过 对账差几毛找了半宿 后来老老实实按分存了

stone57
[链接]

我前两年也在这上头栽过跟头。那会儿想鼓捣个记账的小东西,0.1加0.2出来那串数,我盯着屏幕愣了半天,还以为是自己哪行写错了。翻来覆去查,最后才明白不是人的问题,是浮点它天生就不准。

你后面说的"最小单位按分算"是正经解法。我现在的习惯是,但凡沾钱,一律整数,懒得跟精度较劲。

这种坑嘛,没真踩过一遍,道理听进去也轻飘飘的。踩过一次,反倒睡得着了 ( ̄▽ ̄)

clover_us
[链接]

哎,被数字悄悄捉弄这种事,真的挺让人窝火的。你那 0.1+0.2 蹦出个尾巴,我虽然看不懂代码,但光看那段描述就替你郁闷了一下。

我平常用账本也特怕对不上,几分几毛的差池,表面没事,攒久了心里就不踏实。所以我特别能体会你说的对账能整疯,钱这东西最经不起含糊。你能查出来还好,最怕错了还不知道错在哪。

后来你学乖了用整数按分算,这法子听着就踏实。慢慢来,下次再写个小东西肯定顺手多了。加油呀,这种坑踩过一次,以后就长记性啦。

legacy83
[链接]

0.1+0.2蹦出那串尾巴,头回见的人基本都懵一下,我当年也是。

后来真因为这玩意儿吃过苦头。有回对账,两边差了几分钱怎么都对不平,翻到后半夜才发现是浮点攒出来的误差。你那招按分算最稳,我后来也照这个来。

不过整数也不是万能,除法和四舍五入的边界还是得留神,有些情况照样给你埋雷。

gentle
[链接]

看到那个 0.30000000000000004 的时候,真的能想象到你盯着屏幕怀疑人生的样子。这种因为底层逻辑产生的“小脾气”最搞心态了,明明数学上没错,计算机却非要跟你抬杠。

我也踩过类似的坑,以前做数据清洗时没注意精度,结果报表对不上,查了一晚上才发现是浮点误差累积导致的。后来就养成习惯,涉及金额或者需要精确比对的地方,直接用 Decimal 或者把单位换算成整数处理,虽然代码稍微啰嗦一点,但心里踏实多了。

别太自责啦,这算是程序员成长路上的必经之路嘛。既然已经学乖了,下次再遇到这种背刺就能秒懂了。加油哦 (´・ω・`)

softie2002
[链接]

熬夜搓代码还碰上这种坑,辛苦了呀。这浮点背刺真的太经典,我以前写代码那会儿也在0.1+0.2上栽过…,对着多出来的那几分钱发懵好久。按分存整数确实是治本的法子,简单又省心。这种坑踩过一次,大概这辈子都忘不掉了吧~

marathon
[链接]

我也被这坑背刺过!当初对着对不上的金额怀疑人生,查出来是浮点那一刻真的无语。整数按分算这招稳得很,我后来二话不说全改了。decimal库也给我备上,干就完了

[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
需要登录后才能回复。[去登录]
回复此帖进入修真世界