Para não passar raiva comparando dois números float com PHP nunca faça algo do tipo abaixo:
$a = 0.1;
$b = 0.2;
if ($a + $b == 0.3) {
echo 'Igual';
} else {
echo 'Diferentes';
}
Se fizer isso, vai ver que dá problema devido ao modo como o PHP guarda os valores float.
Para resolver isso criei a função abaixo para comparar dois valores do tipo float.
Logo a comparação do primeiro exemplo seria corretamente executada assim:
$a = 0.1;
$b = 0.2;
if (compara_float($a + $b, 0.3) == 0) {
echo 'Igual';
} else {
echo 'Diferentes';
}
$a = 0.1;
$b = 0.2;
if ($a + $b == 0.3) {
echo 'Igual';
} else {
echo 'Diferentes';
}
Se fizer isso, vai ver que dá problema devido ao modo como o PHP guarda os valores float.
Para resolver isso criei a função abaixo para comparar dois valores do tipo float.
/** * Esta função recebe dois números como parâmetro. * Se os números forem iguais, ou seja, se a diferença * entre eles for menor que a margem de erro aceitável, * a função retorna 0, caso contrário retorna -1 se o * primeiro número for menor, * ou então 1 caso o segundo * seja o menor * @param float $a * @param float $b * @return 0 (igual), -1($num1 menor), 1($num2 menor) */ function compara_float($num1, $num2, $precisao = 5) { $desprezar = pow(0.1, $precisao); $diff = abs($num1-$num2); if ($diff < $desprezar) { return 0; } return $num1 < $num2 ? -1 : 1; }
Logo a comparação do primeiro exemplo seria corretamente executada assim:
$a = 0.1;
$b = 0.2;
if (compara_float($a + $b, 0.3) == 0) {
echo 'Igual';
} else {
echo 'Diferentes';
}
Salvou minha pele essa sua função!!!
ResponderExcluirSucesso e obrigado!!
BC Match do php também é bom.
ResponderExcluir