处理金钱的时候,对于浮点的舍入误差你们是怎么处理的呢?

2020-01-12 13:17:55 +08:00
 dangyuluo

前情提要:

浮点运算结果不准确算不算是 bug ?任何人都不想得到不准确的结果吧 https://v2ex.com/t/637166#reply54


假设有 10 块钱需要给三个人平均分配,精确到分。如果纯粹是四舍五入的话,每个人都会得到 3.33 元。这时候剩下的 1 分钱应该怎么处理呢?

我不是做这行的,单纯只是好奇。

6005 次点击
所在节点    问与答
39 条回复
Xbluer
2020-01-12 13:24:20 +08:00
最后一个人得款是总额减去其他人得款。
eason1874
2020-01-12 13:24:43 +08:00
不会处理的可以把那 0.01 转给我,把余数都给我,就没有余数了。
azh7138m
2020-01-12 13:25:15 +08:00
不是 bug,因为它是浮点数。
怎么处理看 PM 心情了。
ipwx
2020-01-12 13:28:45 +08:00
用 decimal 不用 float,流行的语言基本标准库都有。
loading
2020-01-12 13:30:25 +08:00
金融计算有专门的库,不会有误差。

记得有个方案是,把金额按 1000 倍存的。你的 3.33 元,在数据库是 3330
dangyuluo
2020-01-12 13:31:21 +08:00
@ipwx decimal 并不解决求和的问题啊。
loading
2020-01-12 13:31:46 +08:00
对于你这个分钱问题,似乎是有处理方式的,记不起来了。
ipwx
2020-01-12 13:37:18 +08:00
@dangyuluo 那就用 fraction,Python 标准库就有。
andy101wong
2020-01-12 13:38:21 +08:00
现实怎么处理就怎么处理, 计算机解决不了 3.3333..... ,现实也做不到 10 元钱三等分啊。
delectate
2020-01-12 13:41:25 +08:00
小数点后取两位数,不进行任何四舍五入。
总金额再减去每份求和,得到差额,加入其中某一份即可。

这也是大多数电商、支付平台分期的算法。
dangyuluo
2020-01-12 13:44:47 +08:00
@andy101wong 哈哈哈,我光想着技术怎么处理了,忽略了现实的问题
Mavious
2020-01-12 15:10:42 +08:00
某金融平台,很直接,不搞四舍五入,直接砍小数。
比如应分配 13.33333 元,只给你 13.33 ,应得 16.598 元,只给你 15.59 ,小数点后第三位直接砍掉,不进位。
至于多出的那一分钱,嗯哼,当然是平台拿走啦,轮不到用户的。
ershierdu
2020-01-12 15:30:44 +08:00
看标题我还以为是说用 float 存金额…
hhyyd
2020-01-12 15:39:22 +08:00
我们现在做的是,个人分 10 块,3.33 ,3.33 ,10-3.33-3.33 ,减法是没有误差的。也不会因为 0.01 而影响用户体验
tfdetang
2020-01-12 15:47:24 +08:00
怎么根据我所知,金融行业通行的标准做法是 四舍六入五成双。
imn1
2020-01-12 16:56:59 +08:00
不用电脑你说 10 块钱 3 个人怎么平分?

电脑只是工具……不如上街问问那些“智能机器人”这个问题,看看是什么答案,会不会不同机器人有不同的答案
wccc
2020-01-12 20:41:28 +08:00
入库六位,百分比计算,加到最后
ziseyinzi
2020-01-12 22:52:32 +08:00
某次淘宝买一个一元包邮的东西,发现可以花呗免息分期。变成了 0.33 元 x3 期,省了一分
des
2020-01-12 23:06:59 +08:00
发现这个问题,然后去补了一下知识,下面是我总结的,不一定完全对
1、不能用浮点存小数是以讹传讹
2、不同场景有不同处理,平分一般是加到最后一个人
3、银行还是四舍五入用的最多,主要还是接受的人最多
4、银行会定期对账,这些舍入应该都是在可接受的范围内的
5、银行也在大把的用浮点数。最重要的一点是,误差可控,就比如计算复利
6、钱其实精度要求还算是低的,麻烦的有很多,比如金价
7、误差其实只在进制转换时发生(这个我也不是很确定)

如果有哪里说的不对,希望有人能帮忙指正一下
n121
2020-01-13 00:13:19 +08:00
@ziseyinzi 照理说这种情况最后一期应该扣 0.34 才对呀

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/637240

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX