小樱 发表于 2015/7/26 02:43

充100块钱手续费3% 实际应该付103,商家如何通过103元和手续费3%求出到帐金额和手续费

注:手续费3%是可能会变动的,比如说4.37%,5%等不等,求公式
就是手续费不是从他冲的100里面扣
是需要额外付费来承担

也就是实际金额=100+(100*(3/100))
反过来怎么算

然而商家这边收到的是103元,和通知到了3%的手续费,并没有实际列出3元和100元,现在就是要算出来然后来列举存入数据库


答:
收到的钱/(100+汇率)*100 结果四舍五入
x+(x*(y/100))=收到的钱
就是解个 二元一次方程


$jine=round($jine/(100+plug_eva('spay','手续费'))*100);



学霸群给出的答案,总感觉不对,因为手续费3%的汇率是不固定的。


另一个学霸群给出的答案
实际金额 ÷ (1 + 3%) = 原始金额

套进去公式我认为这个才是正确的。

半醉半醒 发表于 2015/7/26 02:43

w123rq 发表于 2015/7/26 21:54

本帖最后由 w123rq 于 2015/7/26 22:02 编辑

是的,相当于解一个二元一次方程,但是二元一次方程必须要2个方程才能解出实数解集。
所以是算不出来的,会有N个解。
如果你的充值金额是整数,而且手续费最多是xx.xx%两位小数的话,可以用下面这段,但是还是可能会有多个结果:
<?php
function getlength($num) {
        $count = 0;
        $temp = explode ( '.', $num );
        if (sizeof ( $temp ) > 1) {
                $decimal = end ( $temp );
                $count = strlen ( $decimal );
                }
                return $count;
                }
        if($_GET['act']=="cacula"){
                $total=$_POST['total'];
                $total_int=intval($_POST['total']);
                $i=1;
                while($i<=$total){
                        $result=($total/($total_int-$i))-1;
                        if(getlength($result)==2){
                                $rc=$total_int-$i;
                                $rs=round($result*100,2);
                                if($rs<=10){//手续费一般不超过10%
                                ?>
                                Result: Recharge=<?=$rc?> & Tax=<?=$rs?>%<br/>
                                <?
                                }
                        }
                        $i++;
                }
        }
?>
<html>
<body>
<form method="POST" action="?act=cacula">
        Recharge_points:<input type="text" name="total" /><br/>
        <input type="submit" value="Submit"/>
</form>
</body>
</html>
测试结果如上

黑色小河 发表于 2015/7/26 22:36

w123rq 发表于 2015/7/26 21:54
是的,相当于解一个二元一次方程,但是二元一次方程必须要2个方程才能解出实数解集。
所以是算不出来的,会有 ...

<?php
header("Content-type:text/html;charset=utf-8");
if($_GET['act']=="cacula"){
                        $jk['方案1']=round($_POST['得到的钱']/(100+$_POST['手续费'])*100);
                        $jk['方案2']=round($_POST['得到的钱']/(1+($_POST['手续费']/100)));
}
?>
<html>
<body>
方案1:<?php echo $jk['方案1']; ?><br/>
方案2:<?php echo $jk['方案2']; ?><br/><br/>
<form method="POST" action="?act=cacula">
      
      手续费:<input type="text" name="手续费" value="<?php echo $_POST['手续费']; ?>"/>%<br/>
      收到的钱:<input type="text" name="得到的钱"value="<?php echo $_POST['得到的钱']; ?>"/><br/>
                   <input type="submit" value="Submit"/>
</form>
</body>
</html>

小樱 发表于 2015/7/26 22:37

w123rq 发表于 2015/7/26 21:54
是的,相当于解一个二元一次方程,但是二元一次方程必须要2个方程才能解出实数解集。
所以是算不出来的,会有 ...

66666{:1343:}

黑色小河 发表于 2015/7/26 22:47

本帖最后由 黑色小河 于 2015/7/26 22:49 编辑

w123rq 发表于 2015/7/26 21:54
是的,相当于解一个二元一次方程,但是二元一次方程必须要2个方程才能解出实数解集。
所以是算不出来的,会有 ...

然后 我研究了 很长时间方程 知道方案2 的来法
x是未知y是汇率   z是收到的钱
汇率是管理设置好的z是接口收到的钱
得出一开始的方程应该是这个样的x+x*y=z
解 设 y=3% z=103
所以 y=100 / 3
y=0.03
然后代入原方程
得 x+x*0.03=103
1x+0.03x=103
(1+0.03)x=103      
x=103/(1+0.03)【也就是 z/(1+y) 也就是 用户支付的钱/(1+汇率)=用户得到的钱】
x=100

黑色小河 发表于 2015/7/26 22:49

本帖最后由 黑色小河 于 2015/7/26 22:51 编辑

但是方案2 始终想不出怎么得来的 但是方案 1和2 得出的结果始终一样
页: [1]
查看完整版本: 充100块钱手续费3% 实际应该付103,商家如何通过103元和手续费3%求出到帐金额和手续费