本人最近在弄一个提现功能,就是微信的企业打款,代码写得差不多了,但是最近遇到了一个一直想不通的提现手续费问题。 产品狗要求提现要收手续费 8%。比如我我的余额就 2 元 1、全部提现 2-20.08=1.84 也就是我最多拿 1.84 元 2、奇葩提现 假如我就提 1.84 , 那么结果是 1.84-1.840.08 = 0.1 最后我的余额会多出 0.1 出来
问题:
1、同样是能拿到的都是 1.84 元,为什么一个会多出 0.01 来?好苦恼,想不通。最重要的是:产品狗认为这是 bug。
2、有没有好的解决方法?或者怎么说服产品狗?
1
tojike OP 最后那个结果写错了 是 2-( 1.84+1.84*0.08 )=0.01 ,反正就是会多出 0.01 元出来
|
2
sea516 2018-03-13 10:30:18 +08:00
产品智力有问题?
|
3
Tianao 2018-03-13 10:31:42 +08:00 via iPhone
楼主的计算没看懂,不知道是不是精度问题……考虑一下单次提现最低手续费?
|
4
FFLY 2018-03-13 10:32:04 +08:00
2 - (2 * 0.08) = 1.84 ,2 * 0.08 = 0.16
1.84 - (1.84 *0.08) = 1.6928,1.84 *0.08 = 0.1472 问题就在进位上啊 |
5
Antonidas 2018-03-13 10:33:56 +08:00
我好奇什么业务会收 8%的提现手续费...
|
6
pkookp8 2018-03-13 10:38:31 +08:00 via Android 1
就我看不懂吗。。。。为什么说同样拿到 1.84
明明一次 1.84,一次 1.69 啊 |
7
3pmtea 2018-03-13 10:38:32 +08:00
第一种情况里,提现人交了(对应于 2 元的手续费),但是实际上只提了 1.84 元,明显提现人亏了
|
8
tojike OP |
9
b821025551b 2018-03-13 10:39:42 +08:00
关键点不就是精度问题么。。。。这个主要是产品来定,比分还小的单位是上取整还是下取整。
|
10
sea516 2018-03-13 10:40:40 +08:00
一次提 2 元,一次提 1.84 元 有什么好纠结的?
|
11
pelloz 2018-03-13 10:40:48 +08:00 3
提现手续费应该从提出来的钱里面扣除,而不是从剩下的钱里面扣除。在第二种情况,应该这么算:
提现:1.84 实际拿到:1.84*0.92=1.69 余额:2-1.84=0.16 |
12
tojike OP @pkookp8 余额是 2 元 的情况下 最做拿 1.84 ,但是提 1.84 就不一样了 1.84*0.08 = 0.1472(0.15 这里四舍五入了) , 2-( 1.84 (提现金额)+0.15 (手续费)) = 0.01
|
13
580a388da131 2018-03-13 10:45:48 +08:00
2 块手续费 0.16
1.84 手续费 0.1472 四舍五入 0.15 |
14
qiayue 2018-03-13 10:47:25 +08:00
换一种思路就好了,8%相当于平台分成。
账户余额是分成之前的双方共同所有的钱,只不过大头是用户的,小头是平台的。 每次用户提现,都需要拿出 8%留给平台。 比如提现 2 元,平台得到 0.16 元,用户得到 1.84 元。 就不需要再拿 1.84 去计算 8%了。 还有另一种情况,假设余额是 2.1 元,那么 8%就是 0.168 元,这个时候就需要你们制定好规则,是用四舍五入(平台得 0.17 ),还是直接取整(平台得 0.16 )。 |
16
Jarvix 2018-03-13 10:49:07 +08:00
不出意外,功能上线后 1 天内又要改了
|
17
tojike OP 纠结了两天,感觉自己功力还是不够。不管怎么样感谢大家。
|
18
pkookp8 2018-03-13 11:04:51 +08:00 via Android
@tojike 那就是四舍五入了。。。只算手续费或只算拿到的钱然后四舍五入,另一种用原始金额减一下就没这个问题了
|
19
raphaelsoul 2018-03-13 11:27:01 +08:00
货币计算以分为单位是坠吼的 全整数运算取整可以避免大多数精度问题
|
20
nmdx 2018-03-13 11:27:43 +08:00 via Android
自己看看微信钱包的提现。
拿我的 195.72 举例子,点击全部提现,提现金额自动填入 195.52 。 小字说明扣除 0.2 元(0.1 %)手续费 |
21
nmdx 2018-03-13 11:28:59 +08:00 via Android 1
|
22
pagxir 2018-03-13 12:06:56 +08:00 via Android
提现当然是从账号余额扣手续费才合理。比如 ATM 取款手续费,你见过会从你取出来的钱里扣么?况且用户提现 100 块,很自然是希望拿到 100 块,而不是 92。难道你希望用户提了 100,然后再提 8,然后 0.64 一直下去?
|
23
canbingzt 2018-03-13 13:54:00 +08:00
这个是理解问题吧
1.提现 2 元,到手并不是 2 元 2.提现 1.84 元,到手 1.84 这 2 个并不等价 如果是不从余额里扣除手续费,那么提现 2 元(所有金额)计算手续费应该是 (2/1.08)*0.08=0.148148 ……,到手 2/1.08=1.851851 …… 如果是从余额里扣除手续费,那么不能提现所有金额(因为没有余额扣手续费了),计算可提现最大金额是 2/1.08=1.851851 ……,手续费(2/1.08)*0.08=0.148148 …… 与上一条相同 具体规则怎么制定就看你自己了,还有四舍五入还是取整都可以 |
24
scriptB0y 2018-03-13 14:00:02 +08:00
金钱放在数据库里面没有用小数存的,都是用整数存多少分……
|
25
madmanffff 2018-03-13 14:12:21 +08:00
你自己计算 2 块的时候是从提出的 2 块中取手续费的,那提 1.84 的时候肯定是从 1.84 中拿手续费啊,你到手肯定没有 1.84,跟你现在的余额并没有关系。
|
26
tojike OP |
27
canbingzt 2018-03-13 15:39:00 +08:00 1
@tojike
一共 2 元,全部提现,那么设提现金额是 x,有 x+x*0.08 = 2,可提现最大金额是 2/1.08 ,手续费 2/1.08*0.08 提现 2 元,不包含手续费,这个比较简单,提现 2 元,手续费 2*0.08=0.16 ,一共 2.16 ,余额需要大于 2.16 |
28
MortyP 2018-03-13 15:42:19 +08:00 via Android
这个就是看手续费是按照提现得到的金额还是提现前的金额来算的吧,你们两种算法把这俩搞混了吧
|
29
cnkuner 2018-03-13 16:33:55 +08:00 via Android
问题在于精度。
建议产品以 1 元的整倍数提现。 |
30
slince 2018-03-13 23:56:46 +08:00
所以在价格的存取上,单位全部用分,价格的运算也不要直接计算数字,用 https://packagist.org/packages/moneyphp/money 中转下;
|