solo - ¿Cómo redondear/cementar/plantar un número bcmath en PHP?
redondear php hacia arriba (2)
¿Hay alguna función de biblioteca para este propósito, así que no lo hago a mano y me arriesgo a terminar en TDWTF?
echo ceil(31497230840470473074370324734723042.6);
// Expected result
31497230840470473074370324734723043
// Prints
<garbage>
Esto funcionará para ti:
$x = ''31497230840470473074370324734723042.9'';
bcscale(100);
var_dump(bcFloor($x));
var_dump(bcCeil($x));
var_dump(bcRound($x));
function bcFloor($x)
{
$result = bcmul($x, ''1'', 0);
if ((bccomp($result, ''0'', 0) == -1) && bccomp($x, $result, 1))
$result = bcsub($result, 1, 0);
return $result;
}
function bcCeil($x)
{
$floor = bcFloor($x);
return bcadd($floor, ceil(bcsub($x, $floor)), 0);
}
function bcRound($x)
{
$floor = bcFloor($x);
return bcadd($floor, round(bcsub($x, $floor)), 0);
}
Básicamente encuentra el flooy al multiplicar por uno con precisión cero.
Luego puede hacer el máximo / redondo restando eso del total, llamando a las funciones integradas, luego agregando el resultado nuevamente
Editar: fijo para -ve números
ACTUALIZACIÓN: Ver mi respuesta mejorada aquí: ¿Cómo cementar, piso y redondear números bcmath? .
Estas funciones parecen tener más sentido, al menos para mí:
function bcceil($number)
{
if ($number[0] != ''-'')
{
return bcadd($number, 1, 0);
}
return bcsub($number, 0, 0);
}
function bcfloor($number)
{
if ($number[0] != ''-'')
{
return bcadd($number, 0, 0);
}
return bcsub($number, 1, 0);
}
function bcround($number, $precision = 0)
{
if ($number[0] != ''-'')
{
return bcadd($number, ''0.'' . str_repeat(''0'', $precision) . ''5'', $precision);
}
return bcsub($number, ''0.'' . str_repeat(''0'', $precision) . ''5'', $precision);
}
Admiten números negativos y el argumento de precisión para la función bcround ().
Algunas pruebas:
assert(bcceil(''4.3'') == ceil(''4.3'')); // true
assert(bcceil(''9.999'') == ceil(''9.999'')); // true
assert(bcceil(''-3.14'') == ceil(''-3.14'')); // true
assert(bcfloor(''4.3'') == floor(''4.3'')); // true
assert(bcfloor(''9.999'') == floor(''9.999'')); // true
assert(bcfloor(''-3.14'') == floor(''-3.14'')); // true
assert(bcround(''3.4'', 0) == number_format(''3.4'', 0)); // true
assert(bcround(''3.5'', 0) == number_format(''3.5'', 0)); // true
assert(bcround(''3.6'', 0) == number_format(''3.6'', 0)); // true
assert(bcround(''1.95583'', 2) == number_format(''1.95583'', 2)); // true
assert(bcround(''5.045'', 2) == number_format(''5.045'', 2)); // true
assert(bcround(''5.055'', 2) == number_format(''5.055'', 2)); // true
assert(bcround(''9.999'', 2) == number_format(''9.999'', 2)); // true