Mostrar um número com duas casas decimais

571

Qual é a maneira correta de arredondar uma string PHP para duas casas decimais?

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

$formatted_number = round_to_2dp($number);

echo $formatted_number;

A saída deve ser 520.00;

Como deve round_to_2dp()ser a definição da função?

Rich Bradshaw
fonte
13
Isso realmente não é "arredondamento". O arredondamento reduz a precisão. Não adicionará casas decimais a um número que não as possui. Com base em muitas respostas e comentários, parece que as pessoas estão pensando que o arredondamento é algo que não é. roundé uma função matemática, e este é apenas um problema de formatação.
Não se apavora

Respostas:

1131

Você pode usar number_format () :

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

Exemplo:

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

Esta função retorna uma string .

Codemwnci
fonte
4
round () seria melhor para ele de legibilidade e simplicidade também, mas para qualquer coisa fundamental estar ciente de que tem sido conhecido por ser buggy
StringsOnFire
40
@ ÁlvaroG.Vicario roundnão resolve o problema do OP aqui. round("520", 2)retorna o float 520e ecoando que obviamente não o mostrará com duas casas decimais. Para o objetivo do OP - mostrar um número inteiro com duas casas decimais preenchendo-o com zeros à direita - você precisa de uma função de formatação de números, não de arredondamento.
Mark Amery
3
Todas as outras respostas são limitadas a valores decimais com uma notação de ponto. Quando você precisa obter, em 520,00vez disso 520.00, isso simplesmente funciona.
SPRBRN
1
se você quiser limitar única flutuar, mas não int então bcdiv ($ number, 1,2)
Wasim A.
2
Eu acho que você deve usar bcadd (0, $ yournumber, 2), ele vai te dar um resultado perfeito.
Johhuq
214

Use round()(use se você está esperando um número apenas no formato float, caso contrário, use number_format () como resposta dada por Codemwnci ):

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

Do manual:

Descrição:

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

Retorna o valor arredondado de valpara especificado precision(número de dígitos após o ponto decimal). precisiontambém pode ser negativo ou zero (padrão).

...

Exemplo # 1 round()exemplos

<?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
?>

Exemplo # 2 Exemplos 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
fonte
5
@khuderm round($number, 2);não funciona. Quero 520,00 e não 520. Não posso acreditar que a rodada não faça isso por padrão.
Claudiu Creanga
2
Ele nem responde o OP corretamente, mas tem mais de 100 votos!
Rob Sedgwick
200

Alternativamente,

$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00
Marc B
fonte
3
E daí se você quiser 520,00? Eu acho que a outra resposta funciona melhor nesse caso.
SPRBRN
2
^ sem a outra resposta não vai dar duas casas decimais para um int
pythonian29033
1
outras razões que você pode querer isso é que você não quer arredondamento ... ou a minha causa SQL flutua retornou não são tratados da mesma forma floats normais que é um bug PHP matemática
Amb3rL4nn
34

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

por exemplo

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06
SystemX17
fonte
Round fará a funcionalidade exata que Rich está querendo, mas number_format () seria mais interessante para procurar todos os tipos de formatação numérica.
Shamim Hafiz
Esse método também realizará o arredondamento, forçando apenas os dígitos ".00" no final.
SystemX17
10
Eu tentei rodar, mas não funciona - não adiciona 0,00 extra.
Rico Bradshaw
Tente usar um dos exemplos que tenho lá, por conta própria, em um script PHP. Você deve obter o resultado comentado. Caso contrário, você terá um problema com a configuração do PHP em algum lugar.
SystemX17
1
round (520, 2) retorna 520, não 520,00, conforme exigido por @Rich
user761100 15/18
25

Tentar:

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

A saída será:

1,234,545,454.00
Biju
fonte
2
Isso funciona, mas a saída seria uma string e não um número.
Ethan
1
se você quiser usar number_format, pelo menos, faça number_format ($ number, 2, '.', '')
Mihai P.
14

Você pode usar o PHP printfou sprintffunções:

Exemplo com sprintf:

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

Você pode executar o mesmo sem echotambém. Exemplo:sprintf("%.3f", $num);

Resultado:

2.120

Alternativamente, com printf:

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

Resultado:

2.124
Aditya P Bhatt
fonte
12

Outra maneira mais exótica de resolver esse problema é usar bcadd()com um valor fictício para o $ right_operand de 0.

$formatted_number = bcadd($number, 0, 2);
Powtac
fonte
2
Observe que as bc*funções não arredondam para cima, elas sempre arredondam para baixo. Por exemplo, bcadd("1.0999","0.0",1)gera "1.0", não "1.1".
ColinM
1
As funções BC Math, na verdade, apenas param o processamento em $scaledígitos fracionários. Isso é igual ao arredondamento para zero.
Ali
11

Use o PHP number_format ()função .

Por exemplo,

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

A saída será:

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

Isso exibirá exatamente dois dígitos após o ponto decimal.

Vantagem:

Se você deseja exibir dois dígitos somente após um valor flutuante e não para int, use-o.

Wasim A.
fonte
Esta é a solução mais universal se você tiver o bcdiv (é um pacote padrão, mas não padrão no centos6).
Shovas
7

round_to_2dp é uma função definida pelo usuário e nada pode ser feito a menos que você tenha postado a declaração dessa função.

No entanto, meu palpite é fazer isso: number_format($number, 2);

ajreal
fonte
14
Desde o seu primeiro parágrafo, acho que você não entendeu a pergunta. round_to_2dp($number);foi concebido como pseudocódigo; o OP estava pedindo para alguém lhe dizer com o que substituir essa expressão.
Mark Amery
6
$twoDecNum = sprintf('%0.2f', round($number, 2));

O arredondamento arredonda corretamente o número e o sprintf o força a 2 casas decimais, se houver apenas 1 casa decimal após o arredondamento.

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

Ele retornará 5,98 sem arredondar o número.

mrphpguru
fonte
Somente isso também pode fazer o trabalho, floor($retailPrice * 100) / 100;sem necessidade de formato numérico.
somsgod 26/07/19
6

Para arredondamento condicional, ie. mostrar decimal onde é realmente necessário, caso contrário, número inteiro

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
fonte
6

Eu faço o meu.

$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);
joanlgr
fonte
1
É bom ver algumas das matemáticas necessárias para fazer isso. Embora o uso de uma função interna seja o preferido para mim. Não faz sentido reinventar a roda.
precisa
1
Desculpe, mas round (), como está escrito, arredonda o número e, às vezes, não quero arredondar.
joanlgr
5

Aqui recebo duas casas decimais após o .(ponto) usando uma função ...

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 da função acima:

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

Nova resposta correta

Use a função nativa do 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
Mr. HK
fonte
4
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89

Isso fornecerá 2 números após o decimal.

S'copion Sam
fonte
4
Não, não vai. Não sei quando este post foi escrito, mas se você tentar com seu próprio exemplo, pelo menos na minha máquina :-), ele produzirá 520.90. Significado, o arredondamento ocorrerá. Seja cuidadoso!
Boaz Rymland
4

Se você quiser usar dois dígitos decimais em todo o projeto, poderá definir:

bcscale(2);

Em seguida, a seguinte função produzirá o resultado desejado:

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

Mas se você não usar a função bcscale, precisará escrever o código da seguinte maneira para obter o resultado desejado.

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

Para saber mais

jewelhuq
fonte
2

Número sem ronda

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

Aqui está outra solução com strtok e str_pad :

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

Adicionando a outras respostas, como number_format (), por padrão, adicionará milhares de separadores.

Para remover isso, faça o seguinte:

$number = number_format($number, 2, ".", "");
Ivan Ivković
fonte
0
  • Escolha o número de casas decimais
  • Formatar vírgulas (,)
  • Uma opção para aparar zeros à direita

De uma 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;
}

Exemplos

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
fonte
-5

Você pode usar a função 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
fonte
3
-1; esta resposta não acrescenta nada de novo que a resposta de Somnath Muluk ainda não contenha dois anos antes.
Mark Amery
1
Também está errado, como observado no meu comentário sobre a resposta de Somnath.
Mark Amery