komma getallen optellen en vergelijken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Tom aan t Goor

Tom aan t Goor

23/01/2014 20:09:03
Quote Anchor link
Hoi hoi,

Ik heb een vraagje.
Hier 2 stukjes code, die in principe precies het zelfde zijn.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
// Voorbeeld 1
$var1 = 21.00;
$var2 = 3.99;
$var3 = 24.99;

if(($var1+$var2)==$var3){
  echo 'A';
}



// Voorbeeld 2
$var1 = 21.00;
$var2 = 3.99;
$var3 = 24.99;

if( round($var1+$var2,2)== round($var3,2) ){
  echo 'B';
}

?>


In mijn ogen doet dit precies het zelfde.
Je rond het wel af op 2 decimalen, maar de getallen zijn al 2 decimalen, dus is het overbodig.

Alleen, bij mij krijg ik de A niet op het scherm, maar de B wel.
Kan iemand mij dit uitleggen?
 
PHP hulp

PHP hulp

21/11/2024 20:59:49
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

23/01/2014 21:04:28
Quote Anchor link
Het waarom kan ik niet uitleggen, PHP gaat niet goed om met floats.
Je zal dus altijd aan je tweede voorbeeld gebonden zijn.
Gewijzigd op 23/01/2014 21:13:01 door Ger van Steenderen
 
Wouter J

Wouter J

23/01/2014 22:23:03
Quote Anchor link
PHP en floating points, of moet ik zeggen scripttalen en floating points (JAVA heeft er ook problemen mee volgens mij), dat is nooit een succes geweest.

Wij mensen rekenen in base10, dat betekend in een 10-tallig stelsel. Dat klopt ook, 0 - 9 en dan 10 - 19 etc. Een computer rekent in base2, een 2-tallig stelsel ook wel binair stelsel genoemd. Die heeft 0 - 1 en dan 10 - 11, etc. Zie deze tutorial voor diepere informatie hierover.

Wanneer wij dus '0.7' hebben is dit in een base2 float 1111 met als floating point 1 (een float is een geheel getal en de plek van het komma in dat getal). Bij het omzetten gaat wat mis en wat er precies misgaat is systeem afhankelijk, maar het zorgt voor een uitwijking van ong. 1.11e-16. Voor mensen zonder wetenschappelijke notatie kennis, dit is 0.00000000000000111. Dat betekend dat '3.99' '3.990000000000000111' kan worden. En dat plus '21.000000000000000111' wordt '24.99000000000000222' en dat is niet gelijk aan '24.99'. Als je dat echter afrond naar 2 decimalen is het wel gelijk.

Merk overigens op dat je ook met dat afronden moet opletten. floor((0.7 + 0.1) * 10) levert namelijk vaak 7 op en niet 8. Veiliger is het dus om alle getallen eerst apart af te ronden en dat dan te gebruiken.

Mooi? Nee, maar tja.. dat zijn floats :)
Gewijzigd op 23/01/2014 22:28:01 door Wouter J
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.