24 $this->scale = $scale;
32 return extension_loaded(
'bcmath');
40 return bccomp($a, $b, $this->scale);
46 public function add($amount, $addend)
59 public function subtract($amount, $subtrahend)
67 public function multiply($amount, $multiplier)
71 return bcmul($amount, (
string) $multiplier, $this->scale);
77 public function divide($amount, $divisor)
81 return bcdiv($amount, (
string) $divisor, $this->scale);
87 public function ceil($number)
92 return (
string) $number;
96 return bcadd((
string) $number,
'0', 0);
99 return bcadd((
string) $number,
'1', 0);
105 public function floor($number)
110 return (
string) $number;
114 return bcadd((
string) $number,
'-1', 0);
117 return bcadd($number,
'0', 0);
125 return ltrim($number,
'-');
131 public function round($number, $roundingMode)
136 return (
string) $number;
139 if ($number->
isHalf() ===
false) {
140 return $this->roundDigit($number);
146 $number->getIntegerRoundingMultiplier(),
152 return bcadd((
string) $number,
'0', 0);
157 return bcadd((
string) $number,
'0', 0);
162 $number->getIntegerRoundingMultiplier(),
171 $number->getIntegerRoundingMultiplier(),
176 return bcadd((
string) $number,
'0', 0);
181 return bcadd((
string) $number,
'0', 0);
186 $number->getIntegerRoundingMultiplier(),
195 $number->getIntegerRoundingMultiplier(),
207 throw new \InvalidArgumentException(
'Unknown rounding mode');
215 private function roundDigit(Number $number)
217 if ($number->isCloserToNext()) {
220 $number->getIntegerRoundingMultiplier(),
225 return bcadd((
string) $number,
'0', 0);
231 public function share($amount, $ratio, $total)
233 return $this->
floor(bcdiv(bcmul($amount, $ratio, $this->scale), $total, $this->scale));
239 public function mod($amount, $divisor)
241 return bcmod($amount, $divisor);