引言:一定要确保数据的准确性。很神奇的计算功能。
<?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";