ProgrammatieJava ontwikkelaar

Wat zijn de kenmerken van het werken met de datatypes float en double in Java? Wanneer moet je elk van hen toepassen en welke valkuilen kunnen er zijn bij het werken met drijvende getallen?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In Java zijn er twee primaire typen voor het weergeven van drijvende getallen: float (32 bits) en double (64 bits). float is minder nauwkeurig en neemt minder geheugen in beslag, terwijl double een grotere nauwkeurigheid biedt en de voorkeur heeft als standaard datatype voor drijvende getallen.

  • Wanneer float gebruiken: als er zeer strikte eisen zijn qua geheugengebruik (bijvoorbeeld een groot aantal getallen in een array, een apparaat met beperkte middelen).
  • Wanneer double gebruiken: bijna altijd, tenzij er specifieke beperkingen zijn, aangezien double betere nauwkeurigheid biedt.

Belangrijke kenmerken:

  • Operaties met drijvende getallen kunnen leiden tot accumulatie van afrondingsfouten.
  • Gebruik nooit == voor het vergelijken van float/double, gebruik vergelijking met een tolerantie.

Voorbeeld van vergelijking met delta:

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("Gelijk binnen de tolerantie"); } else { System.out.println("Niet gelijk"); } } }

Misleidende vraag

Vraag: Wat geeft de volgende code?

System.out.println(0.1 + 0.2 == 0.3);

Antwoord: Deze code zal false afdrukken, omdat de som 0.1 + 0.2 in het binaire IEEE 754-formaat niet precies gelijk is aan 0.3 vanwege de bijzonderheden van het opslaan van decimale getallen in de datatypes float en double.

Voorbeelden van echte fouten door onbekendheid met de nuances van het onderwerp


Verhaal

In een groot financieel project werden geldtellers in het datatype double gebruikt. In de praktijk leidden kleine bewerkingen vaak tot accumulatie van afrondingsfouten, waardoor de uiteindelijke sommen enkele centen verschilden. Het probleem werd opgelost door double te vervangen door BigDecimal.


Verhaal

In een game-engine werd een array float gebruikt om de coördinaten van objecten in een wereld met grote waarden op te slaan. Bij het verplaatsen over grote afstanden begon de nauwkeurigheid van de positionering van objecten te verliezen, wat leidde tot "trilling" van objecten op het scherm. Het vervangen van float door double en het centreren van de coördinaten hielp het probleem op te lossen.


Verhaal

In een statistische analyseprogramma werden dubbele waarden vergeleken met behulp van de operator == en er werd een onverwacht aantal "niet-overeenkomsten" aangetroffen. Nadat de vergelijking was vervangen door een vergelijking met delta, werkte de logica van het programma correct.