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.

apenas um comentário

  1. willians on

    amigo, essa dica foi minha salvação !!!! tava ficando doido aqui tentando fazer contas com valores retornados pelo mysql e dava resultados estranhos, enfim, resolvido! obrigado!


Leave a reply