mirror of
https://github.com/grocy/grocy.git
synced 2026-04-05 20:36:15 +02:00
helpers DecimalToFraction and FractionToDecimal
This commit is contained in:
parent
c266b53ff1
commit
4d79a94817
|
|
@ -236,3 +236,62 @@ function string_ends_with($haystack, $needle)
|
|||
|
||||
return (substr($haystack, -$length) === $needle);
|
||||
}
|
||||
|
||||
function FractionToDecimal($fraction)
|
||||
{
|
||||
// Split fraction into whole number and fraction components
|
||||
preg_match('/^(?P<whole>\d+)?\s?((?P<numerator>\d+)\/(?P<denominator>\d+))?$/', $fraction, $components);
|
||||
|
||||
// Extract whole number, numerator, and denominator components
|
||||
$whole = $components['whole'] ?: 0;
|
||||
$numerator = $components['numerator'] ?: 0;
|
||||
$denominator = $components['denominator'] ?: 0;
|
||||
|
||||
// Create decimal value
|
||||
$decimal = $whole;
|
||||
$numerator && $denominator && $decimal += ($numerator/$denominator);
|
||||
|
||||
return $decimal;
|
||||
}
|
||||
|
||||
function DecimalToFraction($decimal)
|
||||
{
|
||||
// Determine decimal precision and extrapolate multiplier required to convert to integer
|
||||
$precision = strpos(strrev($decimal), '.') ?: 0;
|
||||
$multiplier = pow(10, $precision);
|
||||
|
||||
// Calculate initial numerator and denominator
|
||||
$numerator = $decimal * $multiplier;
|
||||
$denominator = 1 * $multiplier;
|
||||
|
||||
// Extract whole number from numerator
|
||||
$whole = floor($numerator / $denominator);
|
||||
$decimal = $decimal - $whole;
|
||||
|
||||
//round to manage 1/3
|
||||
$tolerance = 1.e-4;
|
||||
|
||||
$h2 = 0;
|
||||
$numerator = 1;
|
||||
$denominator = 0;
|
||||
$k2 = 1;
|
||||
$b = 1 / $decimal;
|
||||
do {
|
||||
$b = 1 / $b;
|
||||
$a = floor($b);
|
||||
$aux = $numerator;
|
||||
$numerator = $a * $numerator + $h2;
|
||||
$h2 = $aux;
|
||||
$aux = $denominator;
|
||||
$denominator = $a * $denominator + $k2;
|
||||
$k2 = $aux;
|
||||
$b = $b - $a;
|
||||
} while (abs($decimal - $numerator / $denominator) > $decimal * $tolerance);
|
||||
|
||||
// Create fraction value
|
||||
$fraction = [];
|
||||
$whole && $fraction[] = $whole;
|
||||
$numerator && $fraction[] = "{$numerator}/{$denominator}";
|
||||
|
||||
return implode(' ', $fraction);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user