[php] number_format foute afronding 2.495 & 12.495

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Weet iemand waarom dit fout gaat. Simpeler kan het niet, dus het lijkt me echt een fout in de functie.

PHP:
1
2
echo number_format('2.495',2,',',' ')."<br>";
echo number_format('12.495',2,',',' ')."<br>";


De eerste (2.495) wordt 2,50
De tweede (12.495) wordt 12,49

De tweede is dus fout, want dat zou 12,50 moeten worden.

Is dit een fout in de functie, of is er iets anders verkeerd?

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 20:03
Hehe, bizar ;)

PHP.net schuift het m.i. wel erg makkelijk van zich af trouwens: http://bugs.php.net/bug.php?id=23435&edit=1

Op http://nl3.php.net/round wordt hier ook al commentaar op gegeven!

Raar probleem...

  • ajvdvegt
  • Registratie: Maart 2000
  • Laatst online: 13-08 16:01
Dat komt door de manier waarop je CPU afrondt. Daar zit een vaag algoritme in wat wel snel is maar dus niet (altijd) klopt. Dat achter-de-komma geneuzel word op CPU niveau ook niet zo interessant geworden, de meeste breuken worden daar toch getrunceerd (afgebroken), en niet afgerond.

Neemt niet weg dat het heel irritant is voor alle programmeurs op aarde in talen die er geen rekening mee houden, maar goed. In bv. Java wordt het dacht ik wel correct opgelost, maar daardoor is de snelheid ook dramatisch. Op de site die sjroorda noemt staan wel oplossingen.

I don't kill flies, but I like to mess with their minds. I hold them above globes. They freak out and yell "Whooa, I'm *way* too high." -- Bruce Baum


  • sjroorda
  • Registratie: December 2001
  • Laatst online: 20:03
ajvdvegt schreef op 19 februari 2004 @ 19:53:
Dat komt door de manier waarop je CPU afrondt. Daar zit een vaag algoritme in wat wel snel is maar dus niet (altijd) klopt. Dat achter-de-komma geneuzel word op CPU niveau ook niet zo interessant geworden, de meeste breuken worden daar toch getrunceerd (afgebroken), en niet afgerond.

Neemt niet weg dat het heel irritant is voor alle programmeurs op aarde in talen die er geen rekening mee houden, maar goed. In bv. Java wordt het dacht ik wel correct opgelost, maar daardoor is de snelheid ook dramatisch. Op de site die sjroorda noemt staan wel oplossingen.
Maar wil dat dan ook zeggen dat het van de processor waar de server op draait afhangt, dus bijvoorbeeld dat het op een AMD wel goed gaat en op een Intel niet, of hebben alle processoren hetzelfde (efficiente) algoritme?

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Praktische tip:

Als je wilt afronden op 2 cijfers kun je ook het volgende doen:

vermenigvuldig met 100 (10^[aantal cijfer_achter_komma])
rond af met round (of floor/ceil wat je wilt)
deel weer door 100 (zelfde als boven)

Dit kun je uiteraard eenvoudig automatiseren in een losse functie. Om geen nullen te verliezen kun je er achteraf nog een number_format aan plakken.

Weet je zeker dat er altijd 'goed' afgerond wordt :)

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 20:03
Feit blijft dat het een workaround is! Het gewone gebruik van alle standaard functies in alle programmeertalen verdient uiteraard altijd de voorkeur. Lijkt me nuttiger als het probleem bij de wortel wordt aangepakt :).

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het nu zo opgelost dat ik afrond met round en dat number_format het formaat (komma i.p.v. punt) veranderd. 2 functies i.p.v. 1, maar het is niet anders.

PHP:
1
2
3
4
<?
echo number_format(round('2.495',2),2,',',' ')."<br>"; 
echo number_format(round('12.495',2),2,',',' ')."<br>"; 
?>


Bedankt voor de reacties!
Pagina: 1