V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tojike
V2EX  ›  PHP

一个关于提现手续费问题

  •  
  •   tojike · 2018-03-13 10:22:22 +08:00 · 5750 次点击
    这是一个创建于 2429 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人最近在弄一个提现功能,就是微信的企业打款,代码写得差不多了,但是最近遇到了一个一直想不通的提现手续费问题。 产品狗要求提现要收手续费 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、有没有好的解决方法?或者怎么说服产品狗?
    
    30 条回复    2018-03-13 23:56:46 +08:00
    tojike
        1
    tojike  
    OP
       2018-03-13 10:26:38 +08:00
    最后那个结果写错了 是 2-( 1.84+1.84*0.08 )=0.01 ,反正就是会多出 0.01 元出来
    sea516
        2
    sea516  
       2018-03-13 10:30:18 +08:00
    产品智力有问题?
    Tianao
        3
    Tianao  
       2018-03-13 10:31:42 +08:00 via iPhone
    楼主的计算没看懂,不知道是不是精度问题……考虑一下单次提现最低手续费?
    FFLY
        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

    问题就在进位上啊
    Antonidas
        5
    Antonidas  
       2018-03-13 10:33:56 +08:00
    我好奇什么业务会收 8%的提现手续费...
    pkookp8
        6
    pkookp8  
       2018-03-13 10:38:31 +08:00 via Android   ❤️ 1
    就我看不懂吗。。。。为什么说同样拿到 1.84
    明明一次 1.84,一次 1.69 啊
    3pmtea
        7
    3pmtea  
       2018-03-13 10:38:32 +08:00
    第一种情况里,提现人交了(对应于 2 元的手续费),但是实际上只提了 1.84 元,明显提现人亏了
    tojike
        8
    tojike  
    OP
       2018-03-13 10:39:04 +08:00
    @sea516 产品可能是个 zz,但是问题还是得想办法解决,或者想办法说服他

    @Tianao 单次最低手续费这个建议可以,我去提一下 多谢。

    @FFLY 问题就像你说的,很纠结。头大了两天了
    b821025551b
        9
    b821025551b  
       2018-03-13 10:39:42 +08:00
    关键点不就是精度问题么。。。。这个主要是产品来定,比分还小的单位是上取整还是下取整。
    sea516
        10
    sea516  
       2018-03-13 10:40:40 +08:00
    一次提 2 元,一次提 1.84 元 有什么好纠结的?
    pelloz
        11
    pelloz  
       2018-03-13 10:40:48 +08:00   ❤️ 3
    提现手续费应该从提出来的钱里面扣除,而不是从剩下的钱里面扣除。在第二种情况,应该这么算:
    提现:1.84
    实际拿到:1.84*0.92=1.69
    余额:2-1.84=0.16
    tojike
        12
    tojike  
    OP
       2018-03-13 10:42:33 +08:00
    @pkookp8 余额是 2 元 的情况下 最做拿 1.84 ,但是提 1.84 就不一样了 1.84*0.08 = 0.1472(0.15 这里四舍五入了) , 2-( 1.84 (提现金额)+0.15 (手续费)) = 0.01
    580a388da131
        13
    580a388da131  
       2018-03-13 10:45:48 +08:00
    2 块手续费 0.16
    1.84 手续费 0.1472 四舍五入 0.15
    qiayue
        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 )。
    tojike
        15
    tojike  
    OP
       2018-03-13 10:48:31 +08:00
    @pelloz 感谢,我感觉自己被绕进去了。应该是按照你说的那样才符合逻辑 :提现手续费应该从提出来的钱里面扣除
    Jarvix
        16
    Jarvix  
       2018-03-13 10:49:07 +08:00
    不出意外,功能上线后 1 天内又要改了
    tojike
        17
    tojike  
    OP
       2018-03-13 10:50:48 +08:00
    纠结了两天,感觉自己功力还是不够。不管怎么样感谢大家。
    pkookp8
        18
    pkookp8  
       2018-03-13 11:04:51 +08:00 via Android
    @tojike 那就是四舍五入了。。。只算手续费或只算拿到的钱然后四舍五入,另一种用原始金额减一下就没这个问题了
    raphaelsoul
        19
    raphaelsoul  
       2018-03-13 11:27:01 +08:00
    货币计算以分为单位是坠吼的 全整数运算取整可以避免大多数精度问题
    nmdx
        20
    nmdx  
       2018-03-13 11:27:43 +08:00 via Android
    自己看看微信钱包的提现。

    拿我的 195.72 举例子,点击全部提现,提现金额自动填入 195.52 。 小字说明扣除 0.2 元(0.1 %)手续费
    nmdx
        21
    nmdx  
       2018-03-13 11:28:59 +08:00 via Android   ❤️ 1
    pagxir
        22
    pagxir  
       2018-03-13 12:06:56 +08:00 via Android
    提现当然是从账号余额扣手续费才合理。比如 ATM 取款手续费,你见过会从你取出来的钱里扣么?况且用户提现 100 块,很自然是希望拿到 100 块,而不是 92。难道你希望用户提了 100,然后再提 8,然后 0.64 一直下去?
    canbingzt
        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 ……
    与上一条相同

    具体规则怎么制定就看你自己了,还有四舍五入还是取整都可以
    scriptB0y
        24
    scriptB0y  
       2018-03-13 14:00:02 +08:00
    金钱放在数据库里面没有用小数存的,都是用整数存多少分……
    madmanffff
        25
    madmanffff  
       2018-03-13 14:12:21 +08:00
    你自己计算 2 块的时候是从提出的 2 块中取手续费的,那提 1.84 的时候肯定是从 1.84 中拿手续费啊,你到手肯定没有 1.84,跟你现在的余额并没有关系。
    tojike
        26
    tojike  
    OP
       2018-03-13 15:31:26 +08:00
    @pagxir 我们产品也觉得提现的手续费从账号余额扣手续费比较合理。但是会出现那个 0.01 的问题

    @canbingzt 我突然发现你的算法是对的,v2 大神果然多,提现 2 元,手续费 8%我算出来的是 1.84 我只是没搞懂 1.08 怎么来的,1+0.08 么。数学比较菜,谅解。
    canbingzt
        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
    MortyP
        28
    MortyP  
       2018-03-13 15:42:19 +08:00 via Android
    这个就是看手续费是按照提现得到的金额还是提现前的金额来算的吧,你们两种算法把这俩搞混了吧
    cnkuner
        29
    cnkuner  
       2018-03-13 16:33:55 +08:00 via Android
    问题在于精度。
    建议产品以 1 元的整倍数提现。
    slince
        30
    slince  
       2018-03-13 23:56:46 +08:00
    所以在价格的存取上,单位全部用分,价格的运算也不要直接计算数字,用 https://packagist.org/packages/moneyphp/money 中转下;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3352 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:57 · PVG 18:57 · LAX 02:57 · JFK 05:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.