[PHP] Bug in PHP 5.2.2?

Pagina: 1
Acties:
  • 101 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • cdgrit
  • Registratie: Mei 2002
  • Laatst online: 13-01 16:44
Ik heb een simpel scriptje:

<?php
echo 0.285 - 0.28;
?>

Als ik dit uitvoer krijg ik dit resultaat: 0.0049999999999999 :?

Ik heb zojuist de nieuwste PHP versie (5.2.2) geinstalleerd, maar hetzelfde probleem blijft. Ook op een andere server met PHP 5.2.1 krijg ik dit vreemde getal terug.

Als ik de getallen wijzig in "0.275 - 0.27" krijg ik wel netjes 0.005 terug.

Iemand die dit snapt? 8)7


Originele startpagina - Stadindex.nl


Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 16:10
http://bugs.php.net/bug.php?id=10131&edit=1
This is not a bug in PHP. it's how floating point math works, and there
is nothing that we can do to change it.
The problem is that these floating point number are stored as a as good
as possible representation of the numbers you use, but it's not possible
to get them stored exactly as you want them to be.

[ Voor 79% gewijzigd door urk_forever op 22-05-2007 08:46 ]

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • cdgrit
  • Registratie: Mei 2002
  • Laatst online: 13-01 16:44
Maar hoe kan ik er dan voor zorgen dat mijn script wel de juiste uitkomst geeft?


Originele startpagina - Stadindex.nl


Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 16:10

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
^ Dat mag wel wat uitgebreider gezegd worden: Pas afronden als het nodig is, dus wellicht pas bij de presentatie. Kijk ook eens naar functies als number_format() en printf() & co.

Maar wellicht belangrijker dan op de gok een functie toepassen is het lezen waarom dit zo is en misschien moet je je in het algemeen wel inlezen op de verschillende datatypes. ;)

{signature}


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Het is erg logisch te verklaren vanwege de manier waarop floating points in het geheugen opgeslagen wordt.

wiki page

Jammer dat dit blijkbaar tegenwoordig niet meer tot de basis kennis van programmeurs behoort.

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!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50

BikkelZ

CMD+Z

Janoz schreef op dinsdag 22 mei 2007 @ 09:32:
Jammer dat dit blijkbaar tegenwoordig niet meer tot de basis kennis van programmeurs behoort.
Waaruit leid jij af dat het een programmeur is dan? Lijkt me een redelijk normale vraag als je als hobbyist begint in een toegankelijke taal als PHP.

iOS developer


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Hier zit wel een bugje in iig :)
This is not a bug in PHP. it's how floating point math works, and there
is nothing that we can do to change it.
The problem is that these floating point number are stored as a as good
as
possible representation of the numbers you use, but it's not possible
to get them stored exactly as you want them to be.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ViNyL schreef op dinsdag 22 mei 2007 @ 09:54:
Hier zit wel een bugje in iig :)

[...]
Hoe bedoel je dat? Heb je het artikel gelezen dat Janoz postte? Je begrijpt dat een float nooit 100% exact kan worden gerepresenteerd in two's complement? En dat het geen fluit met PHP te maken heeft maar dat iedere implementatie met floats in iedere taal daar 'last' van heeft?
Ah, je zit te miepen over spelvauten... tjeez... :X

[ Voor 29% gewijzigd door RobIII op 22-05-2007 10:11 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
ViNyL schreef op dinsdag 22 mei 2007 @ 09:54:
Hier zit wel een bugje in iig :)
[...]
"zijn opgeslagen als een zo goed als mogelijke representatie", moet kunnen en is ook gewoon correct hoor. :)
BikkelZ schreef op dinsdag 22 mei 2007 @ 09:52:
Waaruit leid jij af dat het een programmeur is dan? Lijkt me een redelijk normale vraag als je als hobbyist begint in een toegankelijke taal als PHP.
Ik vind ook dat het basiskennis moet zijn. Een PHP boek dat ik hier heb liggen begint met een hoofdstuk over datatypes, en dat voor een PHP boek, go figure. :P

[ Voor 49% gewijzigd door Voutloos op 22-05-2007 10:03 ]

{signature}


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Voutloos schreef op dinsdag 22 mei 2007 @ 09:58:
[...]
"zijn opgeslagen als een zo goed als mogelijke representatie", moet kunnen en is ook gewoon correct hoor. :)

[...]
Ik vind ook dat het basiskennis moet zijn. Een PHP boek dat ik hier heb liggen begint met een hoofdstuk over datatypes, en dat voor een PHP boek, go figure. :P
Het is dan zowieso: as AN as good as..

Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

BikkelZ schreef op dinsdag 22 mei 2007 @ 09:52:
[...]


Waaruit leid jij af dat het een programmeur is dan? Lijkt me een redelijk normale vraag als je als hobbyist begint in een toegankelijke taal als PHP.
Voor hobbyisten is het natuurlijk iets dat je tegen moet komen. Inderdaad kan het voor de TS zo zijn dat dit de eerste keer is dat hij het tegenkomt. De opmerking die ik maakte sloeg echter meer op z'n algemeen. In mijn vakgebied, waar ik over het algemeen wel programmeurs hoop tegen te komen ipv hobbyisten, zie ik ook steeds vaker dat mensen dit niet weten.

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!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
offtopic:
vinyl: Ja, en 'number' mag misschien ook wel meervoud zijn gezien het 'these' dat ervoor staat. Grammatica foutjes spotten in manuals is echt zonde van je tijd.

{signature}


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Voutloos schreef op dinsdag 22 mei 2007 @ 10:07:
offtopic:
vinyl: Ja, en 'number' mag misschien ook wel meervoud zijn gezien het 'these' dat ervoor staat. Grammatica foutjes spotten in manuals is echt zonde van je tijd.
:+

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
ViNyL schreef op dinsdag 22 mei 2007 @ 10:04:
[...]


Het is dan zowieso: as AN as good as..
offtopic:
Het is dan sowieso: sowieso.

Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50

BikkelZ

CMD+Z

Janoz schreef op dinsdag 22 mei 2007 @ 10:05:
[...]


Voor hobbyisten is het natuurlijk iets dat je tegen moet komen. Inderdaad kan het voor de TS zo zijn dat dit de eerste keer is dat hij het tegenkomt. De opmerking die ik maakte sloeg echter meer op z'n algemeen. In mijn vakgebied, waar ik over het algemeen wel programmeurs hoop tegen te komen ipv hobbyisten, zie ik ook steeds vaker dat mensen dit niet weten.
Er zijn ook mensen die van een HBO informatica af komen en de spreekwoordelijke diskette niet kunnen formatteren, en zoiets als floats die niet 100% precies zijn dat krijgt iedereen die een programmeeropleiding krijgt (of zelfs een boek koopt vaak al inderdaad), maar als je gewoon niet een bepaald soort inzicht of feeling hebt met de materie dan vergeet je dat soort dingen weer.

iOS developer


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Het formateren van een diskette valt niet onder de werkzaamehden van een programmeur. Ikzelf zou ook niet weten hoe dat (onder linux) moet. De eigenschappen en beperkingen van je datatypes daarintegen horen wel bij de werkzaamheden van een programmeur. Dat een unsigned byte boven de 255 weer bij 0 begint en een float een mantisse en exponent heeft. Dat je voor geld berekeningen beter fixedpoint kunt overwegen. Dat zijn dingen die een programmeur hoort te weten net als een timmerman weet dat je grote rechte stukken met een cirkelzaag doet en klein priegelwerk met een figuurzaag.

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!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
PrisonerOfPain schreef op dinsdag 22 mei 2007 @ 10:11:
[...]

offtopic:
Het is dan sowieso: sowieso.
ik praat liever geen Duits maar het klopt idd wel :) Gelukkig ben ik beter in Engels ipv Nederlands

[ Voor 9% gewijzigd door ViNyL op 22-05-2007 12:04 ]

Pagina: 1