PHP算法:⼀个数字平分为N份,并且总值相等
有的时候,你可能有这种需求,需要将⼀个数分为N等份,多余的⾃动分配给其中⼀个数字。
实现⽅法有如下两种,当然还有其他的,⽐如截取substr等,有兴趣的可以⾃⼰尝试:
第⼀种⽅法,采⽤bc函数,即PHP的数学扩展库bcmath,具体可以点击如下链接查看更多了解
不多说了,直接上代码:
/**
* ⼀个数字平分为N等份
* @param int $number 待平分的数字
* @param int $taotl 平分总个数
* @param int $index 保留⼩数位
*/
function getDivideNumber($number, $total, $index = 2) {
// 除法取平均数
$divide_number  = bcdiv($number, $total, $index);
// 减法获取最后⼀个数
$last_number = bcsub($number, $divide_number*($total-1), $index);
// 拼装平分后的数据返回
$number_str = str_repeat($divide_number.'+', $total-1).$last_number;
return explode(',', $number_str);
}复制代码
家n次方第⼆种⽅法,是我⾃定义的⼀种⽅法,⼤概思路是将待平分的数字乘以10的N次⽅,然后平分floor舍去取整,再除以10的N次⽅得到平分数,再⽤减法获取最后⼀个数,并格式化⼩数位,具体实现⽅法如下:
/**
* ⼀个数字平分为N等份
* @param int $number 待平分的数字
* @param int $taotl 平分总个数
* @param int $index 保留⼩数位
*/
function getDivideNumber($number, $total, $index = 2) {
// 取平均数
$divide_number = floor($number / $total * pow(10, $index)) / pow(10, $index);
$divide_number = number_format($divide_number, $index, '.', '');
// 获取最后⼀个数字
$last_number = $number - $divide_number * ($total - 1);
$last_number = number_format_plus($last_number, $index, '.', '');
// 拼装平分后的数据返回
$number_str = str_repeat($divide_number . ',', $total - 1) . $last_number;
return explode(',', $number_str);
}复制代码
有说的不对的地⽅,请⼤家理解,欢迎留⾔,相互交流。