PHP精确计算功能

引言:一定要确保数据的准确性。很神奇的计算功能。

<?php
/**
 * 精确加法
 * @param [type] $a [description]
 * @param [type] $b [description]
 */
function math_add($a,$b,$scale = '2') {
  return bcadd($a,$b,$scale);
}
/**
 * 精确减法
 * @param [type] $a [description]
 * @param [type] $b [description]
 */
function math_sub($a,$b,$scale = '2') {
  return bcsub($a,$b,$scale);
}
/**
 * 精确乘法
 * @param [type] $a [description]
 * @param [type] $b [description]
 */
function math_mul($a,$b,$scale = '2') {
  return bcmul($a,$b,$scale);
}
/**
 * 精确除法
 * @param [type] $a [description]
 * @param [type] $b [description]
 */
function math_div($a,$b,$scale = '2') {
  return bcdiv($a,$b,$scale);
}
/**
 * 精确求余/取模
 * @param [type] $a [description]
 * @param [type] $b [description]
 */
function math_mod($a,$b) {
  return bcmod($a,$b);
}
/**
 * 比较大小
 * @param [type] $a [description]
 * @param [type] $b [description]
 * 大于 返回 1 等于返回 0 小于返回 -1
 */
function math_comp($a,$b,$scale = '5') {
  return bccomp($a,$b,$scale); // 比较到小数点位数
}
echo math_add('3.445','3.444')."\n"; // 加 6.88
echo math_sub('3.445','3.444')."\n"; // 减 0.00
echo math_mul('3.445','3.444')."\n"; // 乘 11.86
echo math_div('3.445','3.444')."\n"; // 除 1.00
echo math_mod('3.445','3.444')."\n"; // 取模 0
echo math_comp('3.445','3.444')."\n";// 比较 1
echo math_add('3.445','3.444','3')."\n"; // 加 6.889
echo math_sub('3.445','3.444','3')."\n"; // 减 0.001
echo math_mul('3.445','3.444','3')."\n"; // 乘 11.864
echo math_div('3.445','3.444','3')."\n"; // 除 1.000
echo math_mod('3.445','3.444')."\n"; // 取模 0
echo math_comp('3.445','3.444')."\n";// 比较 1
?>

突然看到一个发红包的案例,感觉很好用,收藏一下代码如下:

$amount = 1; // 红包总金额
$packageCount = 30; // 红包总个数
$randomFlag = true; // 金额是否随机
$grantedAmount = 0; // 已领取的金额
$averageAmount = (float)bcdiv($amount, $packageCount, 2);
if ($averageAmount < 0.01) {
    exit("红包个数不能超过 " . $amount / 0.01 . " 个。\n");
}
echo "================== 发包开始,总共 {$amount} 个红包,发给 {$packageCount} 个人。 ==================\n";
for ($i = 1; $i <= $packageCount; $i++) {
    if ($randomFlag) { // 随机分
        $leftAmount = $amount - $grantedAmount;
        $leftPackage = $packageCount - $i + 1;
        $averageAmount = (float)bcdiv($leftAmount, $leftPackage, 2);
        $random = (float)bcdiv(mt_rand(0, ($averageAmount * 100 - 1)), 100, 2); // 边界
        $changeFunction = mt_rand(0, 1) ? 'bcadd' : 'bcsub';
        $shouldGetAmount = $i == $packageCount ? bcsub($amount, $grantedAmount, 2) : $changeFunction($averageAmount, $random, 2);
    } else { // 平均分
        $shouldGetAmount = $i == $packageCount ? bcsub($amount, $grantedAmount, 2) : $averageAmount;
    }
    $grantedAmount = bcadd($grantedAmount, $shouldGetAmount, 2);
    echo "你是第 {$i} 个领取红包的人,领到 {$shouldGetAmount} 个红包。【当前共发了 {$grantedAmount} 个红包】\n";
}
echo "================== 发包结束,总共发了 {$grantedAmount} 个红包。 ==================\n";
echo "end。 \n";


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值