W Javie istnieją dwa podstawowe typy do reprezentacji liczb zmiennoprzecinkowych: float (32 bity) i double (64 bity). float jest mniej dokładny i zajmuje mniej pamięci, podczas gdy double zapewnia większą precyzję i jest preferowanym typem domyślnym dla liczb zmiennoprzecinkowych.
Ważne cechy:
Przykład porównania z deltą:
public class DoubleComparison { public static void main(String[] args) { double a = 0.1 + 0.2; double b = 0.3; double epsilon = 1e-10; if (Math.abs(a - b) < epsilon) { System.out.println("Równe z uwzględnieniem tolerancji"); } else { System.out.println("Nie równe"); } } }
Pytanie: Co wyświetli następujący kod?
System.out.println(0.1 + 0.2 == 0.3);
Odpowiedź: Ten kod wyświetli false, ponieważ wynik sumy 0.1 + 0.2 w formacie binarnym IEEE 754 nie jest dokładnie równy 0.3 z powodu cech przechowywania ułamków dziesiętnych w typach float i double.
Historia
W dużym projekcie finansowym stosowano liczniki gotówki w typie double. W praktyce małe operacje często prowadziły do kumulacji błędów zaokrągleń, w wyniku czego końcowe sumy różniły się o kilka centów. Problem został rozwiązany poprzez zastąpienie double przez BigDecimal.
Historia
W silniku gry używano tablicy float do przechowywania współrzędnych obiektów w świecie o dużych wartościach. Przy poruszaniu się na duże odległości zaczęła ginąć precyzja pozycjonowania obiektów, co prowadziło do "drżenia" obiektów na ekranie. Zastąpienie float przez double i centrowanie współrzędnych pomogły rozwiązać problem.
Historia
W programie do analizy statystycznej porównywano wartości double przy pomocy operatora
==i uzyskiwano nieoczekiwaną liczbę "niespójności". Po zmianie na porównanie z deltą logika programu zaczęła działać poprawnie.