with solo round redondear number_format mostrar hacia floatval decimals decimales arriba php largenumber bcmath

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