Opmerkingen over het vergelijken tussen de numerieke waarden die opgeslagen zijn als een double

0000002680     -      06-01-2017

De double is een type voor het opslaan van een numerieke waarde in het binair met een floating-point.(Binary floating point) Dit betekend dat elk “nummer” niet op een unieke wijze wordt vertegenwoordigd. Hierom kan het vergelijken van twee doubles leiden tot foute resultaten.

Bijvoorbeeld, deze test geeft false:

Zoom
double x1 = 43.65 + 61.11;
double x2 = 104.76;
bool test = (x1 == x2);

omdat de representatie van x1 104.75999999999999 is.

Om dit probleem tegen te gaan houden we rekening met een aantal belangrijke cijfers om de vergelijking uit te voeren. Dit kan uitgevoerd worden door de uitbreiding van het Double type, die gegeven is door MercatorExtensions. Deze uitbreiding geeft een Compare methode die het mogelijk maakt om een tweede parameter te passeren, voor het aantal genomen decimalen dat in aanmerking komen voor de vergelijking.

Dus nu pakken we hetzelfde voorbeeld als hierboven vermeld, uitgevoerd op 2 decimalen, dat nu correct true weergeeft:

Zoom
double x1 = 43.65 + 61.11;
double x2 = 104.76;
bool test = (x1.CompareTo(x2, 2) == 0);

 

De klassieke Compare methode geeft:

  • 1 als x1 groter is dan x2
  • 0 als x1 gelijk is aan x2
  • -1 als x1 kleiner is dan x2

Om deze extension te kunnen gebruiken voegt u de clausule using MercatorExtansions; toe aan de bovenkant van uw code. (Deze clausule wordt automatisch toegevoegd in de Mercator code-editor).

Opmerking:de Compare methode zonder de tweede parameter is er één die standaard bestaat in het .NET Framework. Hij geeft spijtig genoeg hetzelfde resultaat als het eerste voorbeeld van deze pagina. Daarom om zeker te zijn gebruiken we de methode met 2 parameters.

Afhankelijk van waar deze functie, van dit type code, van toepassing is kiest u het aantal decimalen die in de context van toepassing zijn:

  • billingEngine.NDec: totaal aantal decimalen voor de valuta in het document, van het commercieel beheer
  • billingEngine.NDecPu: aantal decimalen voor de valuta van de eenheidsprijzen, in het commercieel beheer document
  • bookingEngine.NDec: aantal decimalen voor de omzet van de boekhoudkundige afschrijving
  • MercatorUi.Globals.N_DEC_P: aantal decimalen voor het gewicht
  • MercatorUi.Globals.N_DEC_Q : aantal decimalen voor de hoeveelheden
  • MercatorUi.Globals.DEC_DEV_B: aantal decimalen achter de basisvaluta van het commercieel beheer
  • MercatorUi.Globals.DEC_DEV_C: aantal decimalen voor de basisvaluta in de boekhouding