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

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

前情提要:

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


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

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

6014 次点击
所在节点    问与答
39 条回复
czhfrank
2020-01-13 02:59:11 +08:00
除法出问题是你分钱的时候的问题,不是记账的问题,记账只记加减,从一个人口袋到另一个人口袋。这问题跟计算机更是八竿子打不着
NewTab12138
2020-01-13 09:09:14 +08:00
为什么不以分为单位来算,而使用元为单位
KyonLi
2020-01-13 09:36:25 +08:00
@NewTab12138 一千分平均分给三人不还是一样的问题
hc181533609
2020-01-13 09:48:06 +08:00
@KyonLi 看最小的单位呗 分还是厘
hc181533609
2020-01-13 09:49:06 +08:00
@KyonLi 不好意思 回错人了
fancy111
2020-01-13 10:01:19 +08:00
程序设计的时候就没设计所谓平分的状态,10 元给三人的时候肯定设计的是有一个多一点余数的。
而且本身 10 元就不可能平分给三个人吧。
ccgoing10
2020-01-13 10:03:08 +08:00
ebs 里面,如果有分摊客户都会要求最后一个倒减
jzbax1230
2020-01-13 10:05:27 +08:00
如果按比例乘,肯定会员 0.01 的精度问题 最后一笔减出来
wensonsmith
2020-01-13 10:12:30 +08:00
银行家舍入, 四舍六入五取偶。

PHP 有 https://github.com/moneyphp/money
racecoder00
2020-01-13 10:27:50 +08:00
Java 银行家舍入:RoundingMode.HAIL_EVEN
zxcjqyy
2020-01-13 10:52:56 +08:00
我刚看淘宝某品牌手机 4199.00 元,花呗分期免手续费分 3 期,1399.67 元。
计算器算得 4199/3=1399.666666..元,四舍五入了
jjianwen68
2020-01-13 10:56:18 +08:00
余数当然留给自家公司了
mxT52CRuqR6o5
2020-01-13 11:12:18 +08:00
@andy101wong 对的,这个问题和浮点数和计算机根本没关系
Hilong
2020-01-13 11:14:34 +08:00
说起这个,很早期的银行结算小数点四位后的好像就直接丢弃,有个人发现了,把这个转到了自己的账号,挣了几百上千万后被发现了
samlee123
2020-01-13 11:54:21 +08:00
@Hilong 有一部电影 有这个桥段
pupboss
2020-01-13 12:17:34 +08:00
@zxcjqyy 你说的应该是商品页面,实际生成还款账单的时候还是最后一期用减法
opengps
2020-01-13 12:32:49 +08:00
第一个或者最后一个用来处理余数问题,一向如此
mcfog
2020-01-13 14:14:00 +08:00
平分: 不用总量 /份数,而是用“剩余量 /剩余份数”,就能控制误差在最多一分,算等额本息还款等场景类似,相当于把每次舍入造成的误差积累起来摊在下面一份,而不是全堆在最后或者最开头

舍入:银行家算法 (四舍六入五成双)
muhairen
2020-01-13 16:10:04 +08:00
@Hilong 攻壳机动队就有啊

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

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

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

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

© 2021 V2EX