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.
Belangrijke kenmerken:
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"); } } }
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.
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.