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)?
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.
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.