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

前两天帮人看个小系统的对账,月底对不上,差了三分钱。追到底,根子是拿 float 存金额了。

0.1 加 0.2 在二进制里压根不是 0.3,是个无限循环的近似值,print 出来是 0.30000000000000004。单笔看无所谓,可几百上千笔订单累加,那截尾巴就被放出来了,账单跟实收对不上,财务直接炸。

这坑老生常谈,真上手照样踩。金额就两招:要么用整数,最小单位按分存 int;要么上 decimal,那是专为精确小数设计的。float、double 天生给科学计算那种"差不多就行"的活儿用的,碰钱就别让它碰。

btw 我刚学那会儿也这么干过,算完还觉得自己挺对,第一次对账差出来才反应过来。现在谁代码里 float 当钱使,我都会多嘴一句。

grey81
[链接]

我年轻那会儿刚摸电脑,也以为屏幕上显示啥就是啥。后来见着有人拿浮点算工资,月底发薪差了几块钱,全车间闹翻天,会计差点把计算器砸了。我觉得吧

说到底还是你那句话,钱这玩意儿经不起差不多。不过我多嘴补一句,整数按分存是稳,可一旦碰上利息、汇率那种带除法的活儿,int也兜不住,该用decimal还得用,只是乘除之前那套取舍规则得先定明白,不然尾差还是会从缝里钻出来。话说回来以前程序小,谁管这些,现在系统一串起来,三分钱能牵出半本烂账。

spicy23
[链接]

0.30000000000000004 这串数字怎么看怎么像系统在笑话人。说真的,你那"见一个 float 就多嘴一句"的执念我喜欢,当年要有人这么拽我一把,我也不至于乖乖交过学费 ( ̄▽ ̄)

cardio2005
[链接]

这坑我也踩过,第一次对账差出来那感觉太真实了。int按分存最稳,干就完了!

sweet30
[链接]

这三分钱真够闹心的。我从前也犯过类似的糊涂,当时还觉得没啥,后头才咂摸出味道来。你那句多嘴是该的。

canvas_kr
[链接]

你那句"差不多就行",倒是让我愣了愣。有一说一

前阵子我也撞上过一回类似的事,不是钱,是时间。有个脚本拿浮点算间隔,单次差那么一星半点,谁也不会去较真。可它一天天跑着,跑了大半年,某天一对总时长,悄悄歪出去好几分钟。那种感觉挺特别——不是轰一声炸开的错,是潮水退沙似的,把你脚下的东西一点一点带走,等你低头,已经站不稳了。

二进制里那些藏不住的循环小数,说穿了是人跟机器在"精确"二字上各说各话。我们以为落笔的 0.1 便是 0.1,机器只认它那套逼近的把戏。几百笔一叠,平时憋着的那口气,到底还是吐了出来。

所以你后来见谁拿 float 当钱使都要多嘴一句,这毛病我倒挺赞成。有些坑道理人人都听过大略,真要没人拦那一下,手照样往坑里伸。

skeptic19
[链接]

这 0.30000000000000004 打印出来那一长串尾巴,komisch 得让人又想笑又想哭,谁还没在这坑里栽过呢。我见过更离谱的是有人拿 float 算完还特意 round 了一下,以为自己稳了,结果 round 的是那个近似值,越 round 越歪。你们那三分钱财务还能炸,说明对账的人起码是真的在认真看,这年头反而稀罕了

dr74
[链接]

补一个细节:decimal 也不是免死金牌。它确实为精确小数设计,但默认精度有限位,1 除以 3 在 decimal 里照样是无限循环,得靠你自己设好精度位数和舍入模式(比如 ROUND_HALF_UP)才稳。我见过有人从 float 跳槽到 decimal 以为万事大吉,结果做除法又踩了同样的坑,只是尾巴换了个位置藏。

所以你说的两招里,整数按分存其实最省心,根本没舍入规则要操心。decimal 更像把问题从暗处挪到明面上,但规矩还是得人来定。

vibes__513
[链接]

想起以前帮人写小工具也这么踩过,对账差几毛查了一下午现在只要看见有人拿 double 存金额就手痒。decimal 真香,慢那点性能根本没关系啦

hamster_bee
[链接]

我当年也踩过 差七分 第一反应以为对面系统有bug 后头才反应是自己憨

penguin__us
[链接]

我当年也是对账对到半夜才发现是double的锅,从此见钱就用分hh

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