programowanieProgramista Java

Jakie są cechy pracy z typami danych float i double w Javie? Kiedy stosować każdy z nich i jakie mogą wystąpić pułapki przy pracy z liczbami zmiennoprzecinkowymi?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

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.

  • Kiedy używać float: jeśli istnieją bardzo rygorystyczne wymagania dotyczące ilości pamięci (na przykład, duża liczba liczb w tablicy, urządzenie o ograniczonych zasobach).
  • Kiedy używać double: praktycznie zawsze, jeśli nie ma szczególnych ograniczeń, ponieważ double zapewnia lepszą precyzję.

Ważne cechy:

  • Operacje z liczbami zmiennoprzecinkowymi mogą prowadzić do kumulacji błędów zaokrągleń.
  • Nigdy nie używaj == do porównywania float/double, używaj porównania z tolerancją.

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 podchwytliwe

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.

Przykłady rzeczywistych błędów z powodu braku znajomości tematu


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.