[PHP] Float / integer

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • _Gekkie_
  • Registratie: Oktober 2000
  • Laatst online: 24-06 20:21

_Gekkie_

And the cow said: Helloooooow?

Topicstarter
Ik snaps iets niet:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$arr1 = array();
$arr2 = array();
$var1 = (1.19-1)*100;
$var2 = (float)19;

var_dump($var1);
var_dump(intval($var1));

var_dump($var2);
var_dump(intval($var2));

$arr1[$var1] = 1;
$arr1[$var2] = 2;

$arr2[$var1] = 1;
$arr2[$var2] = 2;

var_dump($arr1);
var_dump($arr2);
?>


Wat zou je verwachten dat hieruit komt?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
loat(19)
int(19)
float(19)
int(19)

array(1) {
  [19]=> int(2)
}

array(1) {
  [19]=> int(2)
}


Maar niets is minder waar
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
float(19)
int(18)
float(19)
int(19)

array(2) {
  [18]=> int(1)
  [19]=> int(2)
}

array(2) {
  [18]=> int(1)
  [19]=> int(2)
}


Dat `klopt` ook: http://bugs.php.net/bug.php?id=42658... maar kan iemand mij uitleggen waarom? Waarom kan ik een typecast doen en dan mag 'float 19' wel als index, maar als het een resultaat is van de functie niet? Dat is toch gek?

Gekkie is a proud member of TheBenny!


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat is de fout nou? Ik zie het niet. $var1 is net iets minder dan 19, $var2 is precies 19. Daarmee een array indexeren levert dan ook 18 en 19 op, aangezien ze naar int getruncate worden. Ik snap niet wat je bedoelt met typecasten en resultaten van functies e.d.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dat staat toch duidelijk bij die bug report? Je wil niet afhankelijk zijn van floats bij keys ivm beperkte precisie. Bovendien lijkt het me meestal ook een vrij slechte key voor een array element.

{signature}


Acties:
  • 0 Henk 'm!

  • _Gekkie_
  • Registratie: Oktober 2000
  • Laatst online: 24-06 20:21

_Gekkie_

And the cow said: Helloooooow?

Topicstarter
Wat is:
$var1 = (1.19-1)*100;

dat is toch 'precies' 19?

En ik snap dat je dat niet zou willen, maar waarom kan het wel als ik het 'hard' tot float maak via:
PHP:
1
2
3
<?php
float($var);
?>


ik hoef ook niet perse het type 'float' als key, maar wel het resultaat. Waarom is een intval((float)19) wel netjes 19, maar intval((1.19-1)*100) niet? 1.19-1 is toch gewoon 0.19 (exact) en dat weer maal 100 komt gewoon op 19...maar stiekum is dat dus een int 18?

Gekkie is a proud member of TheBenny!


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

_Gekkie_ schreef op dinsdag 13 november 2007 @ 15:45:
Wat is:
$var1 = (1.19-1)*100;

dat is toch 'precies' 19?
Op mijn computer is dat 18.99999999999999467092948179925
Kom op zeg, basis programmeerkennis. Een float heeft maar gelimiteerde precisie, en 1.19 past daar niet in. float(1.19) is dus niet precies 1.19, float(1.19) - 1 is niet precies 0.19 en (float(1.19) - 1) * 100 is niet precies 19. What else is new :)

[ Voor 19% gewijzigd door .oisyn op 13-11-2007 15:55 . Reden: PHP werkt met 64 bits floats, niet met 32 bits floats. ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

computers werken niet met een decimaal stelsel, maar met binair. Net zoals je in het decimale stelsel niet exact 1/3 uit kunt drukken kun je bepaalde waarden ook niet exact in het binaire stelsel uitdrukken. Ik raad je dan ook aan om de link door te lezen die ook gegeven wordt in de bug report.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • _Gekkie_
  • Registratie: Oktober 2000
  • Laatst online: 24-06 20:21

_Gekkie_

And the cow said: Helloooooow?

Topicstarter
zucht... het is ook logisch...

sluiten maar! :)

Gekkie is a proud member of TheBenny!

Pagina: 1