zmiennoprzecinkowych są z natury nieprecyzyjne i są bardzo rzadko równa się ze sobą ze względu na sposób ich przechowywania i błędów zaokrągleń. Powinieneś porównywać pływaki, sprawdzając, czy te dwie wartości są "wystarczająco blisko". To znaczy, porównując bezwzględną wartość różnicy między tymi dwoma wartościami do znacznie małego marginesu błędu (często określanego jako "epsilon").
Jedna taka implementacja może być:
if (abs($total - 1) < 0.000000001)
die("total is 1");
} else {
die("total is not 1");
}
Należy zauważyć, że wymagania Twoja aplikacja może ustalić, co naprawdę bezpieczny margines błędu jest i na co punkt numery powinny być zaokrąglone na wyświetlaczu.
Jeśli masz do czynienia z wartościami walutowymi, na przykład, i wymagają dokładnej precyzji, lepszym rozwiązaniem byłoby zrezygnować z arytmetyki zmiennoprzecinkowej całkowicie. Jedną z opcji w tym przypadku byłoby użycie typu całkowitoliczbowego i zapisanie liczby jako centów, dzielenie tylko w ostatniej minucie, aby wyświetlić numer użytkownikowi (lub nawet nie dzieląc, i zamiast tego wprowadzając kropkę dziesiętną do łańcucha).
http://stackoverflow.com/questions/4682889/is-floating-point-ever-ok – thumbmunkeys