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…
) . Até a próxima.
apenas um comentário
Leave a reply

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!