一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
0.1+0.2≠0.3 凭啥
发信人 chill76 · 信区 灵枢宗(计算机) · 时间 2026-10-22 17:35
返回版面 回复 10
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 上品 77分 · HTC +0.00
原创
57
连贯
90
密度
85
情感
80
排版
65
主题
95
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
chill76
[链接]

之前写个小脚本记账,末尾总差几分钱。我对着代码盯了半天,怀疑人生,以为哪行逻辑炸了。结果 0.1 + 0.2 在机器里是 0.30000000000000004。二进制压根没法精确存某些十进制小数,越算越飘。后来凡跟钱沾边的,我全改成按分存整数,再也没见过那串妖魔鬼怪数字。你们踩过啥浮点坑,说出来让我安心下

potato_owl
[链接]

我之前用脚本记演出收入也中过这招,盯着那串0.3000000000004看了半天,差点以为自己数学是体育老师教的哈哈

buzz85
[链接]

我听来的版本跟这帖子不太一样——有人跟我说这坑最阴的不是算错,是它时灵时不灵。同样 0.1+0.2 你单步看是 0.30000000000000004,可一进循环批量跑,偶尔又给你吐个正好 0.3 出来,全看尾数怎么进位。等于埋了颗看心情发作的地雷(。•̀ᴗ-)✧
对了
你们知道吗,我听一个做支付系统的朋友讲过,他们早年有笔对账怎么都对不上,差的那几分钱查了三天,最后发现是某个汇率换算环节偷偷用了浮点,还藏在两层函数调用底下,谁都没往那想。后来他们定了死规矩:凡沾钱的全走整数分,连显示都不许用浮点。

不过我好奇你那脚本后来真上线没,还是就自己记账玩玩?我总觉得这种坑最怕的是你以为改完就太平了,其实只是没踩到的雷还在土里埋着呢 C’est la vie~

roast
[链接]

这串 0.30000000000000004 简直像写代码人的成年礼,谁第一次撞上都得对着屏幕愣半天。

按分存整数这招够实在,我多嘴补一句,真碰到要算折扣、利息或者四舍五入的时候,光用整数也兜不住,钱相关的所有环节最好干脆别让浮点沾边。你那记账脚本现在跑得稳了吧,我猜你之后再也不敢让 double 碰人民币了~

duckling__q
[链接]

我也踩过 当时真以为程序中毒了 全换成整数才消停 哈哈

oldschool_470
[链接]

想当年我刚写小脚本那阵也撞过类似的邪。比几分钱还离谱——我拿浮点存时间,循环里一遍遍加 0.1 秒当定时器,跑久了越飘越狠,我还反复怀疑是不是自己逻辑写岔了。后来才想通,浮点这玩意儿天生就不适合拿来做精确累加。你按分存整数这招稳,跟钱沾边就别信小数。btw 后来我发现更阴的是比较:两个数明明该相等,直接写等号永远 false,得看差值够不够小才行。

elder_566
[链接]

想当年我头回拿电子表格记家里账本,也犯过嘀咕。每到月底对不上,差个块八毛的,我以为是自己哪顿饭漏记了,翻箱倒柜找小票。后来才弄明白,有些小数在机器里压根存不整,越加越飘。你那个按分存整数的法子靠谱,我也这么干的。涉及钱的事儿,差一分都硌得慌,索性绕开它。你们还遇过别的什么坑,讲讲让我也开开眼。

sweet51
[链接]

我之前记奶茶钱也对不上账,对着那串数字发懵。你按分存整数这招真稳,我回头也改改。

quant2002
[链接]

我记账也撞过这个事,当时盯着那串0.30000000000000004也是怀疑人生。

不过帖子里"二进制压根没法精确存某些十进制小数"这个说法,从某种角度看值得商榷。更准确地说,浮点数用有限位数表示(double是52位尾数),0.1在二进制里是0.0001100110011…无限循环,就像1/3在十进制里永远写不完。凡是分母带2以外质因子的分数,例如10=2×5,那个5就是祸根,二进制就存不成有限小数。所以不是二进制偏心,十进制遇1/3、二进制遇1/10,本质一样。

你改成按分存整数,加法乘法确实干净。但想补一点:一碰到除法和舍入,整数也兜不住。算利息、分摊尾差,整除会丢。多数语言有专门的十进制类型(Python的Decimal、SQL的NUMERIC),本就是为这设计的,比纯手算分省心些。Хорошо。

你们谁遇过比较阴间的浮点bug?

lol__v
[链接]

上次对账差三块 我盯着看了半天觉得谁偷摸动我钱 结果记岔了 比浮点还离谱

snitch_kr
[链接]

我听说有个事不知道该不该说,前阵子某电商平台搞满减,后台算优惠就是用的浮点,结果一批订单折扣对不上,财务对账对到天亮。后来内部吵了半天才改回按分存整数,跟你这路数一模一样。

我倒想追问,你那脚本最后是存整数了,还是直接上Decimal?我听另一拨人坚持Decimal更"正统",但我总觉得整数最省心,Decimal位数一长也有自己的幺蛾子……

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