Tengo un número que debe redondearse a un decimal específico, ¿hay alguna función en PHP para hacer eso?
Necesito que cada número (que refleja una cantidad de dinero) tenga un número decimal específico. Por ejemplo:
El decimal debe ser 25 , por lo que si obtuve $ 25,50 , necesito que sea $ 26,25 , y si obtuve $ 25,10 , debe ser $ 25,25 .
Revisé PHP round() , y específicamente ceil() , y encontré esta respuesta en Python , pero no estoy seguro de que se aplique a mi caso, porque lo que necesito es diferente.
¿Algunas ideas? Incluso el pseudocódigo como consejo sobre por dónde empezar me ayudará. ¡Gracias!
Creo que necesitas una función personalizada, algo como esto:
function my_round($number, $decimal = 0.25) { $result = floor($number) + $decimal; if ($result < $number) $result = ceil($number) + $decimal; return $result; } print my_round(25.50);Modifiqué esta respuesta para tu caso:
<?php function roundUp($number){ $int = floor($number); $float = $number-$int; if ($float*10 < 2.5) $result = $int; else $result = ceil($number); $result+= 0.25; echo $number." becomes ".$result."\n"; } roundUp(25.50); roundUp(25.10);Busque demostración aquí
Siguiendo el consejo de axiac mencionado en los comentarios y siguiendo this thread , la mejor manera de lidiar con los números de punto flotante en el contexto de las monedas es tratar los valores de dólares y centavos como 2 entidades separadas.
Una forma en que puedo pensar en dividir los números antes y después del decimal en 2 variables separadas y procesar en consecuencia.
<?php function customRound($amount){ $amount = strval($amount); if(preg_match('/(\d+)\.?(\d{1,2})?/', $amount, $matches) !== 1){ throw new \Exception("Invalid amount."); } $dollars = intval($matches[1]); $cents = intval($matches[2] ?? 0); if($cents < 10) $cents *= 10; if($cents <= 25) return $dollars . ".25"; return ($dollars + 1) . ".25"; } $tests = [25.51,25.49,26.25,25.10,25.49]; foreach ($tests as $test){ echo $test," => ",customRound($test),PHP_EOL; }