Porównywanie zmiennoprzecinkowych typów danych

 

Sprawdzanie równości wartości całkowitych jest oczywiste:

System.out.println( "( 3 == 1 + 2 ) --- " + (3 == 1 + 2) ); 

Ale w wypadku typów zmiennoprzecinkowych (float, double) nie możemy przedstawić niektórych liczb dziesiętnych w systemie binarnym więc wynik będzie odmienny:

System.out.println( "( 0.3 == 0.1 + 0.2 ) --- " + (0.3 == 0.1 + 0.2) );     // teoretycznie 0.3 == 0.1+0.2, ale dla komputera to jest false

ToDo - opisać przykład z 0.300000000000001 itd.

 

Dlatego takie porównanie musimy robić, zadając przyjętą dokładność wyniku w następujący sposób:

System.out.println( "( 0.3 == 0.1 + 0.2 ) --- " + ( Math.abs(0.3 - (0.1 + 0.2)) < 0.000001) );

Użyliśmy statycznej metody Math.abs(), aby uzyskać bezwględną wartośc z odejmowania 0.3 - (0.1+0.2), a następnie sprawdziliśmy, czy ta wartość jest bliska zeru z zadaną dokładnością. Jeśli różnica jest odpowiednio małą, uznajemy, że porównywane wartości są równe i wynik porównania to true.