1.1. 数字按照某值做切割
/**
* 数字按照某值做切割
* @param $number
* @param $maxNumber
* @param int $d
* @return array
* @throws \Exception
*/
public function SpiltNumberByMaxNumber($number, $maxNumber, $d = 2)
{
if($number==0 || $maxNumber==0){
throw new \Exception("数字不能为0");
}
$maxNumber = abs($maxNumber);
$flag = false;
if($number<0){
$number = abs($number);
$flag = true;
}
$numbers = [];
$res = bccomp($number, $maxNumber, $d);
if ($res < 0) {
throw new \Exception("总数不能小于最大切割数");
}
if ($res > 0) {
while($number > 0){
if($number >= $maxNumber){
$number = (double)bcsub($number,$maxNumber,$d);
if($number >= 0){
$numbers[] = $maxNumber;
}
}else{
$numbers[] = $number;
$number = 0;
}
}
}
else {
$numbers[] = $number;
}
if($flag){
$numbers = array_map(function($v)use($d){
return (double)bcsub(0,$v,$d);
},$numbers);
}
return $numbers;
}
1.1.1. test
// SpiltNumberByMaxNumber(1.2,0.5,2);
// array:3 [
// 0 => "0.50"
// 1 => "0.50"
// 2 => "0.20"
// ]
-----
// SpiltNumberByMaxNumber(-1.2,-0.5,2);
// array:3 [
// 0 => -0.5
// 1 => -0.5
// 2 => -0.2
// ]