[PHP] getallen converteren

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

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dag

ik heb een php scriptje voor het samenvoegen van 2 txt bestanden.
Deze bestanden bevatten getallen.
In het eerste bestand staat alle informatie van de persoon en het totale bedrag .
Ik het 2de bestand staat alle informatie met alle aparte bedragen van betalingen.

nu heb ik het probleem dat hij een groot deel goed omzet, dus wanneer het verschil van de som van de betallingen gelijk is aan het totale bedrag mag deze weggeschreven worden naar een ander bestand.

nu heb ik in een aantal gevallen dat het totale bedrag in de som van de betalingsbedragen een zeer raar getal uitkomen.

vb. mijn output
1ste getal is het totale bedrag, 2de is de Som en 3de is het verschil van beide
code:
1
2
3
4
5
6
7
230.62 - 230.62 / 0 /  OK 
227.94 - 227.94 / 0 /  OK 
417.71 - 417.71 / 5.68434188608E-014 / NIET OK
506.18 - 506.18 / 0 / OK 
537.47 - 537.47 / 0 / OK 
485.92 - 485.92 / 1.13686837722E-013 / NIET OK
258.63 - 258.63 / 0 / OK


Ik lees alles uit uit CSV files en zet dan al mijn getallen om met deze functie. DIt doe ik omdat er in mijn CSV file ook de EUR wordt achter geplaats en dat ik deze niet kan gebruiken voor een som te maken.
$getal is gewoon de string waarde van het veld waar het getal is opgeslagen (vb: 123,45 EUR).

code:
1
2
3
4
5
6
7
8
9
10
<?
function convert_getal($getal){
    $temp = explode(" EUR",$getal);
    if( strlen( $temp[0]) > 7){
        $temp2 = explode(".", $temp[0]);
        return ereg_replace(',','.',$temp2[0] . $temp2[1]);
    }else
        return ereg_replace(',','.',$temp[0]);
}
?>


Ik hoop dat iemand hier een oplossing of een verklaring voor heeft.

Alvast bedankt
Malines

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Je loopt hier aan tegen de preciesie waarmee getallen verwerkt worden. Zie hiervoor de PHP handleiding:
So never trust floating number results to the last digit and never compare floating point numbers for equality.
5.68434188608E-014 betekent 5.68434188608 * 10-14, ofwel een heel erg klein getal. Wil je toch graag weten of beide bedragen gelijk aan elkaar zijn, kun je kijken of het verschil in absolute waarde erg klein is: if(abs($num1 - $num2) < 1E-8) { /* getallen zijn gelijk */ }

psst

[ Voor 6% gewijzigd door GlowMouse op 12-02-2007 15:16 ]


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
dat rare getal is gewoon een wetenschappelijke notatie voor het correcte getal

wat jij wilt is denk ik 2 cijfers achter de komma (geld dus)
gewoon afronden zou het moeten oplossen

'round' dus ;)

trouwens is het een veel voorkomend probleem met floating point values

[ Voor 15% gewijzigd door BasieP op 12-02-2007 15:17 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je hebt het over "bedrag", het gaat dus over geldbedragen? Gebruik dan gewoon hele getallen, in centen. Heb je ook nooit last van afrondingsfouten :). Banken doen dit ook (maar dan met wat meer decimalen). Floating point getallen zijn niet bedoelt voor het uitdrukken van geldbedragen.

[ Voor 16% gewijzigd door .oisyn op 12-02-2007 15:26 ]

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!

Verwijderd

Topicstarter
Bedankt mijn probleem is opgelost