Executando verificação de segurança...
2

Como vocês lidam com números float ou double no dia-a-dia?

Boa tarde pessoas, espero que estejam bem! Hoje me deparei pela 3 vez com problemas de comparação de valores com casas decimais no PHP, segue o a mensagem personalizada que deixamos:
ValorTotalException: O valor total (1342.1) da entidade (fulana) ficará menor que o valor lançado (1342.1). o código verifica LITERALMENTE se o valor lançado é maior que o total;
$ valorTotal > $ valorLançado.

Como esses valores foram calculados, imagino que a precisão deles estejam ligeiramente diferentes, por mais que na hora de exibir eles sejam iguais, ao fazer a comparação esses bits a mais ou a menos resultam nesse problema.

Qual seria o jeito correto de gerenciar cálculos em PHP com números decimais? Explicitamente números que são monetários (com duas casas decimais)?

Carregando publicação patrocinada...
4

float não é adequado para valores monetários. Os números de ponto flutuante são imprecisos e possuem várias nuances difíceis de perceber. Se quiser se aprofundar mais, aqui tem vários links sobre o assunto - e cada um desses links tem vários outros, são horas de diversão garantida :-)

Para trabalhar com dinheiro, o melhor é usar outro tipo. Muitas linguagens possuem algum tipo nativo (geralmente chamado decimal), mas não é o caso do PHP, então o jeito seria usar uma biblioteca externa.

Ou se for um caso mais simples, pode usar números inteiros que guardam a quantidade de centavos, por exemplo. Então em vez de 1.42, use 142. Lembrando que ainda tem que se preocupar com arredondamentos, e cada caso é um caso.

1

Rapaz eu ia escrever exatamente isso, para não usar float com valores monetários. Se usa muito o float em computação científica pois são feitos muitos cálculos e é necessário armazenar os números com a maior precisão possível para que os erros de truncamento não se propaguem de forma deletéria no resultado final, víde o exemplo do Excel 2007 que dava erros grosseiros devido a isso. Agora se não vai fazer cálculos complexos com a quantidade o ideal é evitar o float.

1

De um var_dump nos valores ele exibirá exatamente o valor, incluindo todas casas decimais.

Ou então é como a mensagem diz, a comparação é feita se o número é maior, no caso não é maior por isso deve estar ocorrendo o erro, pelo que parece são iguais.