Mostrar un número con dos decimales

572

¿Cuál es la forma correcta de redondear una cadena PHP a dos decimales?

$number = "520"; // It's a string from a database

$formatted_number = round_to_2dp($number);

echo $formatted_number;

La salida debería ser 520.00;

¿Cómo debe ser la round_to_2dp()definición de la función?

Rich Bradshaw
fuente
13
Esto realmente no es "redondeo". El redondeo reduce la precisión. No agregará decimales a un número que no los tenga. Según muchas de las respuestas y comentarios, parece que la gente piensa que redondear es algo que no es. roundes una función matemática, y esto es solo un problema de formato.
No entre en pánico

Respuestas:

1132

Puede usar number_format () :

return number_format((float)$number, 2, '.', '');

Ejemplo:

$foo = "105";
echo number_format((float)$foo, 2, '.', '');  // Outputs -> 105.00

Esta función devuelve una cadena .

Codemwnci
fuente
44
round () también sería mejor por su legibilidad y simplicidad, pero para cualquier cosa crítica, tenga en cuenta que se sabe que tiene errores
StringsOnFire
40
@ ÁlvaroG.Vicario roundno resuelve el problema del OP aquí. round("520", 2)devuelve el flotador 520, y haciendo eco eso, por supuesto, no lo mostrará a 2 decimales. Para el propósito del OP, que muestra un número entero con 2 decimales al rellenarlo con ceros finales, necesita una función de formato de número, no una función de redondeo.
Mark Amery
3
Todas las demás respuestas están limitadas a valores decimales con una notación de puntos. Cuando necesita obtener en 520,00lugar de 520.00, esto simplemente funciona.
SPRBRN
1
si desea limitar solo flotante pero no int entonces bcdiv ($ number, 1,2)
Wasim A.
2
Creo que deberías usar bcadd (0, $ yournumber, 2) te dará un resultado perfecto.
jewelhuq
214

Use round()(use si espera un número solo en formato flotante, de lo contrario use number_format () como respuesta dada por Codemwnci ):

echo round(520.34345, 2);   // 520.34
echo round(520.3, 2);       // 520.3
echo round(520, 2);         // 520

Del manual:

Descripción:

float round(float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]]);

Devuelve el valor redondeado de vala especificado precision(número de dígitos después del punto decimal). precisionTambién puede ser negativo o cero (predeterminado).

...

Ejemplo # 1 round()ejemplos

<?php
    echo round(3.4);         // 3
    echo round(3.5);         // 4
    echo round(3.6);         // 4
    echo round(3.6, 0);      // 4
    echo round(1.95583, 2);  // 1.96
    echo round(1241757, -3); // 1242000
    echo round(5.045, 2);    // 5.05
    echo round(5.055, 2);    // 5.06
?>

Ejemplo # 2 ejemplos de modo

<?php
    echo round(9.5, 0, PHP_ROUND_HALF_UP);   // 10
    echo round(9.5, 0, PHP_ROUND_HALF_DOWN); // 9
    echo round(9.5, 0, PHP_ROUND_HALF_EVEN); // 10
    echo round(9.5, 0, PHP_ROUND_HALF_ODD);  // 9

    echo round(8.5, 0, PHP_ROUND_HALF_UP);   // 9
    echo round(8.5, 0, PHP_ROUND_HALF_DOWN); // 8
    echo round(8.5, 0, PHP_ROUND_HALF_EVEN); // 8
    echo round(8.5, 0, PHP_ROUND_HALF_ODD);  // 9
?>
Somnath Muluk
fuente
55
@khuderm round($number, 2);no funciona. Quiero 520.00, no 520. No puedo creer que la ronda no lo haga por defecto.
Claudiu Creanga
2
¡Ni siquiera responde el OP correctamente, pero tiene más de 100 votos!
Rob Sedgwick
200

Alternativamente,

$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00
Marc B
fuente
3
¿Y qué si quieres 520,00? Supongo que la otra respuesta funciona mejor en ese caso.
SPRBRN
2
^ no, la otra respuesta no dará dos decimales para un int
pythonian29033
1
otras razones por las que puede desear esto es que no desea redondear ... o en mi causa, los flotadores SQL devueltos no se tratan de la misma manera que los flotadores normales, que es un error matemático de PHP
Amb3rL4nn
34

http://php.net/manual/en/function.round.php

p.ej

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06
SystemX17
fuente
Round hará la funcionalidad exacta que Rich desea, pero number_format () sería más interesante para buscar todo tipo de formato numérico.
Shamim Hafiz
Este método también realizará el redondeo sobre forzar los dígitos ".00" al final.
SystemX17
10
Lo intenté todo, pero no funciona, no agregará el .00 adicional.
Rich Bradshaw
Intente usar uno de los ejemplos que tengo allí, solo en un script PHP. Deberías obtener el resultado comentado. Si no, entonces tienes un problema con tu configuración de PHP en alguna parte.
SystemX17
1
round (520, 2) devuelve 520, no 520.00 según lo requerido por @Rich
user761100
25

Tratar:

$number = 1234545454; 
echo  $english_format_number = number_format($number, 2); 

El resultado será:

1,234,545,454.00
Biju
fuente
2
Eso funciona, pero el resultado sería una cadena y no un número.
Ethan
1
si desea usar number_format al menos hágalo number_format ($ number, 2, '.', '')
Mihai P.
14

Puedes usar PHP printfosprintf funciones:

Ejemplo con sprintf:

$num = 2.12;
echo sprintf("%.3f", $num);

Puedes correr lo mismo sin echo también. Ejemplo:sprintf("%.3f", $num);

Salida:

2.120

Alternativamente, con printf:

echo printf("%.2f", $num);

Salida:

2.124
Aditya P Bhatt
fuente
12

Otra forma más exótica de resolver este problema es utilizarlo bcadd()con un valor ficticio para $ right_operand de 0.

$formatted_number = bcadd($number, 0, 2);
Powtac
fuente
2
Tenga en cuenta que las bc*funciones no se redondean, siempre se redondean hacia abajo. Por ejemplo, bcadd("1.0999","0.0",1)produce "1.0", no "1.1".
ColinM
1
Las funciones de BC Math en realidad solo detienen el procesamiento en $scaledígitos fraccionarios. Esto equivale a redondear hacia cero.
Ali
11

Use la función PHP number_format () .

Por ejemplo,

$num = 7234545423;
echo number_format($num, 2);

El resultado será:

7,234,545,423.00
Sani Kamal
fuente
8
bcdiv($number, 1, 2) // 2 varies for digits after the decimal point

Esto mostrará exactamente dos dígitos después del punto decimal.

Ventaja:

Si desea mostrar dos dígitos solo después de un valor flotante y no para int, utilice esto.

Wasim A.
fuente
Esta es la solución más universal si tiene bcdiv (es un paquete estándar pero no predeterminado en centos6).
Shovas
7

round_to_2dp es una función definida por el usuario, y no se puede hacer nada a menos que haya publicado la declaración de esa función.

Sin embargo, mi suposición es hacer esto: number_format($number, 2);

ajreal
fuente
14
Desde su primer párrafo, creo que ha entendido mal la pregunta. round_to_2dp($number);se entiende como pseudocódigo; el OP estaba pidiendo que alguien le dijera con qué reemplazar esa expresión.
Mark Amery
6
$twoDecNum = sprintf('%0.2f', round($number, 2));

El redondeo redondea correctamente el número y el sprintf lo fuerza a 2 decimales si resulta ser solo 1 decimal después del redondeo.

JohnS
fuente
6
$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', ''); 

Devolverá 5.98 sin redondear el número.

mrphpguru
fuente
Solo esto también puede hacer el trabajo floor($retailPrice * 100) / 100;sin necesidad de formato de número entonces.
somsgod
6

Para redondeo condicional, es decir. mostrar decimal donde realmente se necesita, de lo contrario, número entero

123.56 => 12.56

123.00 => 123

$somenumber = 123.56;

$somenumber = round($somenumber,2);

if($somenumber == intval($somenumber))
{
    $somenumber = intval($somenumber);
}

echo $somenumber; // 123.56


$somenumber = 123.00;

$somenumber = round($somenumber,2);

if($somenumber == intval($somenumber))
{
    $somenumber = intval($somenumber);
}

echo $somenumber; // 123    
Viney
fuente
6

Yo hago la mía.

$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);
joanlgr
fuente
1
Es agradable ver algunas de las matemáticas necesarias para hacer esto. Aunque usar una función incorporada es preferible para mí. No tiene sentido reinventar la rueda.
Bombilla1
1
Lo siento, pero redondear (), como dice, redondear el número y, a veces, no quiero redondear.
joanlgr
5

Aquí obtengo dos decimales después del .(punto) usando una función ...

function truncate_number($number, $precision = 2) {

    // Zero causes issues, and no need to truncate
    if (0 == (int)$number) {
        return $number;
    }

    // Are we negative?
    $negative = $number / abs($number);

    // Cast the number to a positive to solve rounding
    $number = abs($number);

    // Calculate precision number for dividing / multiplying
    $precision = pow(10, $precision);

    // Run the math, re-applying the negative value to ensure
    // returns correctly negative / positive
    return floor( $number * $precision ) / $precision * $negative;
}

Resultados de la función anterior:

echo truncate_number(2.56789, 1); // 2.5
echo truncate_number(2.56789);    // 2.56
echo truncate_number(2.56789, 3); // 2.567

echo truncate_number(-2.56789, 1); // -2.5
echo truncate_number(-2.56789);    // -2.56
echo truncate_number(-2.56789, 3); // -2.567

Nueva respuesta correcta

Use la función nativa de PHP bcdiv

echo bcdiv(2.56789, 1, 1);  // 2.5
echo bcdiv(2.56789, 1, 2);  // 2.56
echo bcdiv(2.56789, 1, 3);  // 2.567
echo bcdiv(-2.56789, 1, 1); // -2.5
echo bcdiv(-2.56789, 1, 2); // -2.56
echo bcdiv(-2.56789, 1, 3); // -2.567
Sr. HK
fuente
4
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89

Esto te dará 2 números después del decimal.

S'copion Sam
fuente
44
No, no lo hará. No sé cuándo se escribió esta publicación, pero si la prueba con su propio ejemplo, al menos en mi máquina :-), generará 520.90. Es decir, se producirá redondeo. ¡Ten cuidado!
Boaz Rymland
4

Si desea utilizar dos dígitos decimales en todo su proyecto, puede definir:

bcscale(2);

Entonces la siguiente función producirá el resultado deseado:

$myvalue = 10.165445;
echo bcadd(0, $myvalue);
// result=10.11

Pero si no utiliza la función bcscale, debe escribir el código de la siguiente manera para obtener el resultado deseado.

$myvalue = 10.165445;
echo bcadd(0, $myvalue, 2);
// result=10.11

Para saber mas

jewelhuq
fuente
2

Numero sin ronda

$double = '21.188624';
echo intval($double) . '.' . substr(end(explode('.', $double)), 0, 2);
Abhishek Sharma
fuente
1

Aquí hay otra solución con strtok y str_pad :

$num = 520.00
strtok(round($num, 2), '.') . '.' . str_pad(strtok('.'), 2, '0')
Bryan
fuente
0

Agregar a otras respuestas, ya que number_format (), por defecto, agregará miles de separador.

Para eliminar esto, haga esto:

$number = number_format($number, 2, ".", "");
Ivan Ivković
fuente
0
  • Elige el número de decimales
  • Formato de comas (,)
  • Una opción para recortar ceros finales

¡De una vez por todas!

function format_number($number,$dec=0,$trim=false){
  if($trim){
    $parts = explode(".",(round($number,$dec) * 1));
    $dec = isset($parts[1]) ? strlen($parts[1]) : 0;
  }
  $formatted = number_format($number,$dec); 
  return $formatted;
}

Ejemplos

echo format_number(1234.5,2,true); //returns 1,234.5
echo format_number(1234.5,2);      //returns 1,234.50
echo format_number(1234.5);        //returns 1,235
Kareem
fuente
-6

Puede usar la función PHP round () .

echo round(3.4);         // 3
echo round(3.5);         // 4
echo round(3.6);         // 4
echo round(3.6, 0);      // 4
echo round(1.95583, 2);  // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2);    // 5.05
echo round(5.055, 2);    // 5.06
Sadikhasan
fuente
3
-1; Esta respuesta no agrega nada nuevo que la respuesta de Somnath Muluk no contenía ya 2 años antes.
Mark Amery
1
También está mal, como se señaló en mi comentario sobre la respuesta de Somnath.
Mark Amery