BCMath – PHP fazendo contas direitinho

Salve

Não sei vocês, mas adoro o PHP. Me dá suporte a quase tudo que preciso para desenvolver bem. Um problema do PHP voltei a ver essa semana, e é até comum em algumas linguagens: erros em operações com números decimais. Como disse antes, adoro o PHP, e a solução está em uma extensão infelizmente pouco usada: a BCMath.

O problema acontece quando algum numero decimal na operação não é convertido facilmente para uma notação fracionária internamente no PHP, o que pode culminar em alguns bugs; veja o exemplo abaixo, retirado da documentação oficial:

echo floor((0.1 + 0.7)*10);

Isto irá exibir 7, e não 8 como esperado. o problema está não conversão para numero fracionário: o floor está recebendo 7.999999999, que resultará em 7;

Para os casos em que você necessita de precisão em números arbitrários existe a BCMath (Binary Calculator Mathematics). É uma extensão, obtida no pacote do php, geralmente habilitada por padrão. Dúvidas na instalção? deixe um comentário.

Se esta extensão estiver habilitada, você terá disponíveis as seguintes funções:

  • bcscale($precisao) – Seta o número de casas decimais (precisão) padrão para todas as funções BCMath do script
  • bcadd($n1,$n2,[$precisao]) – soma 2 números;
  • bccomp($n1,$n2,[$precisao]) – compara $n1 e $n2: se forem iguais retorna 0; 1 se $n1 > $n2, senão -1;
  • bcdiv($n1,$n2,[$precisao]) – Divide $n1 por $n2
  • bcmod($n1,$n2,[$precisao]) – Retorna o resto da divisão de $n1 por $n2
  • bcmul($n1,$n2,[$precisão]) – Multiplica $n1 por $n2
  • bcpow($n1,$n2,[$precisao]) – Retorna $n1 potência de $n2
  • bcpowmod($n1,$n2,$mod,[$precisao]) – O mesmo que bcmod(bcpow($n1,$n2),$mod), mais rápido
  • bcsqrt($n1,[$precisao]) – Retorna a Raiz Quadrada de $n1
  • bcsub($n1,$n2,[$precisao]) – Retorna $n1 – $n2

$precisao é um parâmetro opcional para todas as funções, exceto bcscale. O padrão no php.ini é 0, podendo ser alterado via ini_set, ou pelo bcscale.

Espero que esta pequena resenha sobre a BCMath seja útil (como foi pra mim… como foi… :D ) . Até a próxima.

This entry was posted in geral by Duodraco. Bookmark the permalink.

About Duodraco

Sou Anderson Casimiro, também conhecido como Duodraco. Trabalho com Desenvolvimento Web desde 2002; desde então tive a oportunidade de trabalhar com grandes amigos e aprender bastante. Como já se deve ter percebido meu foco de atuação é PHP, embora eu brinque com Java e C++/Qt nas horas vagas, além do bom e velho Javascript, e dos sempre amigos Mysql, Oracle, sqLite e Postgres. Sou usuário Linux / OpenSuse / KDE apesar de já ter utilizado o Janelas e o OS X. Bom, mas não falemos de passado. Sou um dos coordenadores do PHPSP, junto ao Augusto Pascutti e Rafael Dohms. Atuo como Analista, Desenvolvedor e Scrum Master na Arizona. Sou Engenheiro Certificado Zend (ZCE – Zend Certified Engineer – 2007), Certified Scrum Master e entusiasta do uso de PHP, Linux, KDE e Software Livre em geral.