2023-04-15 14:49:41 +00:00
|
|
|
/**
|
|
|
|
* bc math wrapper (very basic not for accounting)
|
|
|
|
*
|
|
|
|
* @param string $type The type bc math
|
|
|
|
* @param int $val1 The first value
|
|
|
|
* @param int $val2 The second value
|
|
|
|
* @param int $scale The scale value
|
|
|
|
*
|
2023-08-18 05:49:54 +00:00
|
|
|
* @return string|int|null|bool
|
2023-04-15 14:49:41 +00:00
|
|
|
*
|
|
|
|
* @since 3.0.9
|
|
|
|
*/
|
|
|
|
public static function bc($type, $val1, $val2, $scale = 0)
|
|
|
|
{
|
2023-08-18 05:49:54 +00:00
|
|
|
// Validate input
|
|
|
|
if (!is_numeric($val1) || !is_numeric($val2))
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Build function name
|
2023-04-15 14:49:41 +00:00
|
|
|
$function = 'bc' . $type;
|
2023-08-18 05:49:54 +00:00
|
|
|
|
|
|
|
// Use the bcmath function if available
|
|
|
|
if (is_callable($function))
|
2023-04-15 14:49:41 +00:00
|
|
|
{
|
|
|
|
return $function($val1, $val2, $scale);
|
|
|
|
}
|
2023-08-18 05:49:54 +00:00
|
|
|
|
2023-04-15 14:49:41 +00:00
|
|
|
// if function does not exist we use +-*/ operators (fallback - not ideal)
|
|
|
|
switch ($type)
|
|
|
|
{
|
|
|
|
case 'mul':
|
|
|
|
return (string) round($val1 * $val2, $scale);
|
|
|
|
case 'div':
|
2023-08-18 05:49:54 +00:00
|
|
|
if ($val2 == 0) return null; // Avoid division by zero
|
2023-04-15 14:49:41 +00:00
|
|
|
return (string) round($val1 / $val2, $scale);
|
|
|
|
case 'add':
|
|
|
|
return (string) round($val1 + $val2, $scale);
|
|
|
|
case 'sub':
|
|
|
|
return (string) round($val1 - $val2, $scale);
|
|
|
|
case 'pow':
|
|
|
|
return (string) round(pow($val1, $val2), $scale);
|
|
|
|
case 'comp':
|
2023-08-18 05:49:54 +00:00
|
|
|
$diff = round($val1 - $val2, $scale);
|
|
|
|
return ($diff > 0) ? 1 : (($diff < 0) ? -1 : 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Basic sum of an array with more precision
|
|
|
|
*
|
|
|
|
* @param array $array The values to sum
|
|
|
|
* @param int $scale The scale value
|
|
|
|
*
|
|
|
|
* @return float
|
|
|
|
*
|
|
|
|
* @since 3.0.9
|
|
|
|
*/
|
|
|
|
public static function sum($array, $scale = 4)
|
|
|
|
{
|
|
|
|
// use the bcadd function if available
|
|
|
|
if (function_exists('bcadd'))
|
|
|
|
{
|
|
|
|
// set the start value
|
|
|
|
$value = 0.0;
|
|
|
|
// loop the values and run bcadd
|
|
|
|
foreach($array as $val)
|
|
|
|
{
|
|
|
|
$value = bcadd($value, (string) $val, $scale);
|
|
|
|
}
|
|
|
|
return $value;
|
2023-04-15 14:49:41 +00:00
|
|
|
}
|
2023-08-18 05:49:54 +00:00
|
|
|
// fall back on array sum
|
|
|
|
return array_sum($array);
|
2023-04-15 14:49:41 +00:00
|
|
|
}
|