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

先说结论:浮点数别拿 == 直接比,涉及钱和计数的地方干脆别用浮点。
其实
前几天调一段统计逻辑,两个小数一加怎么都对不上,打印出来是 0.30000000000000004。原因不复杂,0.1 和 0.2 在二进制里都是无限循环,存不精确,加完自然带误差。这不是你代码写错了,是 IEEE 754 的固有特性,谁写都这德性。

踩坑的重灾区是相等判断。你写 if (a == 0.3) 基本永远进不去,正确姿势是上 epsilon 容差:abs(a - 0.3) < 1e-9。就差一个等号,结果天差地别。

最要命的是金额。见过有人拿 float 跑账单,几分钱的误差累积到最后对账直接对崩,查了一整晚。钱、库存、计数这类必须精确的场景,老老实实用整数(比如按分存)或者 decimal,一步到位,别给自己埋雷。

浮点本来就是给科学计算凑合用的近似值,落到账本上就是隐患,这坑踩过一次就长记性了。

oldschool__114
[链接]

前两天看新人写的报表脚本,也是栽在这上头。不过我倒想补一句:epsilon 容差看着对症,真到了对账那关还是别全信它。几个数来回加减,误差方向未必均匀散开,abs 一包就给盖过去了,最后差出来的那几分钱你根本查不出从哪漏的。怎么说呢

我年轻的时候也迷信过 fabs(a-b)<1e-9 这套,后来才算明白,规矩就一条:凡跟钱打交道的,从源头用整数按分存,或者 decimal,别让浮点进账本。epsilon 是给科学计算兜底用的,不是给账本擦屁股。

0.1+0.2 谁第一次见都懵,踩过一回就老实了。

hamsterful
[链接]

我之前拿excel记房租,差几分钱硬翻半小时记录找哪笔算岔了,Genau! 这坑谁踩谁知道

ancient2000
[链接]

我年轻写代码那会儿也栽在0.1+0.2上,对着屏幕愣了半天。后来凡碰钱一律按分存整数,图个省心。浮点这东西,能不碰就不碰。

potato_41
[链接]

0.30000000000000004 这串数字我眼睛都看熟了哈哈。epsilon 哪招我以前也栽过,== 直接写进去 branch 死活不进,半夜 debug 到怀疑人生。钱还是按分存最稳,decimal 写着写着就容易上头

honey20
[链接]

这个坑我刚入职那阵也栽过,也是几分钱的对账对到崩溃。后来老老实实按分存整数,世界都清净了。别担心,踩过一次基本就忘不掉啦,加油

meh_uk
[链接]

0.30000000004这串数我看一次恶寒一次 上次对账差一分查到凌晨哈哈

sleepy2003
[链接]

0.30000000000000004这串输出我存过截图,第一次见真以为是屏幕抽了哈哈

sonnet81
[链接]

0.30000000000000004 这个尾巴读起来竟有点温柔,像是再精密的秩序里也总留着一道不肯被收服的缝隙,倒比干净的 0.3 更 honest 些。

haha_cat
[链接]

0.30000000000000004 这串数字看着就烦 钱还是老老实实按分存吧,差一分对账能让人失眠一整晚

lol_dog
[链接]

按分存真香,之前同事拿double管库存,月底差两百多件,查到天亮真headache

breeze_jr
[链接]

楼主说的那个几分钱累积对账对崩的场面,光是看着就让人头大。我以前跟账打交道的时候也碰过类似的暗坑,那种"明明每张单子都对、合起来偏偏差那么一丢丢"的感觉太折磨人了,sounds really familiar。

不过 epsilon 那个写法虽然稳,新人很容易把阈值随手一写就埋新雷,1e-9 在这儿 ok,换个精度要求高的场景可能又不够。所以能上 decimal 我还是建议别犹豫,这个 feature 真的很 nice,一步到位最省心。

平时顺其自然不强求我挺认同的,但钱这块还是得较较真,它可不会跟你讲情面 ( ̄▽ ̄)

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