De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: André Milani
Data de Publicação: 13 de abril de 2017
Nesta publicação eu vou falar sobre algo que a maioria dos programadores PHP desconhecem ao comparar números decimais, e que pode acabar trazendo uma grande dor de cabeça pra você.
Se você anda comparando números decimais no PHP sem utilizar o comando
round
, você pode estar passando por sérios apuros! Isso ocorre pois muitos
programadores não conhecem a fundo como o PHP lida com este tipo de número
e não sabem dos problemas que podem ser causados por falta do uso do comando
round
. Mas calma, não se preocupe, eu vou explicar para você neste artigo,
onde vou abordar duas dicas muito legais sobre PHP. Observe este exemplo:
<?php $varA = 0.25; $varB = 1 - 0.75; // 0.25 if($varA == $varB) { $resultadoConta1 = 'valores iguais'; } else { $resultadoConta1 = 'valores diferentes'; } echo 'Conta #1 - Comparando '.$varA.' e '.$varB.': '.$resultadoConta1.'< br>'; // Conta #1 - Comparando 0.25 e 0.25: valores iguais ?>
Até aqui tudo bem, certo? A variável $varA
foi inicializada com o número
0.25
e a variável $varB
foi inicializada com o resultado de 1 - 0.75
,
que é 0.25
. A comparação é realizada e é impresso na tela que
os valores são iguais.
Agora vamos observar o mesmo código PHP, porém com outros números de
exemplo, mas que também deveriam ser iguais, como por exemplo $varA
sendo inicializada com 0.23
e $varB
inicializada com 1 - 0.77
,
que é 0.23
:
<?php $varA = 0.23; $varB = 1 - 0.77; // 0.23 if($varA == $varB) { $resultadoConta2 = 'valores iguais'; } else { $resultadoConta2 = 'valores diferentes'; } echo 'Conta #2 - Comparando '.$varA.' e '.$varB.': '.$resultadoConta2.'< br>'; // Conta #2 - Comparando 0.23 e 0.23: valores diferentes ?>
Pois é. Se você executou este código você pôde comprovar na prática que
o PHP, neste caso, imprimirá na tela que os valores 0.23
e 0.23
são diferentes, mesmo sendo iguais aos nossos olhos.
Isso ocorre porque, internamente, o PHP não arredonda automaticamente as casas decimais em suas operações matemáticas, e se isso for somado ao fato dos processadores dos computadores apresentarem pontos flutuantes em algumas operações, certamente essa flutuação (ou variação, se preferir) aparecerá em algum momento se não for corrigida.
O lado bom de conhecer como as coisas funcionam internamente é que você pode
solucionar eventuais problemas como este, e fazer isso no PHP é muito fácil:
basta forçar o arredondamento das casas decimais, baseado no número de casas
que você estiver trabalhando, por meio do comando round
.
A sintaxe do comando round
é muito simples: round($valor, $precisao)
,
onde o parâmetro $valor
deve ser o seu número decimal, e $precisao
o número de casas para o arredondamento. Pronto, com isso o próprio PHP
arredonda os números, eliminando a flutuação indesejada. Veja como este mesmo
código pode ser corrigido, mesmo com os valores que apresentaram problemas:
<?php $varA = round(0.23, 2); $varB = round(1 - 0.77, 2); // 0.23 if($varA == $varB) { $resultadoConta3 = 'valores iguais'; } else { $resultadoConta3 = 'valores diferentes'; } echo 'Conta #3 - Comparando '.$varA.' e '.$varB.': '.$resultadoConta3.'< br>'; // Conta #3 - Comparando 0.23 e 0.23: valores iguais ?>
Se você gostou dessa dica e tem interesse em aprender a programar em PHP, quero lhe fazer um convite: já estão abertas a inscrições para o PHP Academy, o maior evento online e gratuito de PHP do Brasil, realizado pela Softblue. Este evento é totalmente dedicado ao ensino do PHP para quem quer começar a trabalhar com essa. Inscreva-se GRAUITAMENTE agora mesmo clicando aqui.
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários