PHP afronden
Beste,
Ik ben met PHP een soort systeempje aan het maken waardoor ik mijn gewerkte uren + ontvangen geld kan bijhouden.
Ik loop alleen op een foutje wat betreft het afronden, dit is mijn code:
$bruto_loon zou volgens mijn rekenmachine 199.995, afgerond 200 dus, moeten zijn.
PHP zegt dat dit 199,99 is, wat doe ik verkeerd?
Mvg, Joost.
Ik ben met PHP een soort systeempje aan het maken waardoor ik mijn gewerkte uren + ontvangen geld kan bijhouden.
Ik loop alleen op een foutje wat betreft het afronden, dit is mijn code:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$bruto_uurloon = 4.02;
$gewerkte_uren = 49.75;
$bruto_loon = $bruto_uurloon * $gewerkte_uren;
echo '<tr><td>Bruto loon:</td><td>'.$bruto_uurloon.' * '.$gewerkte_uren.' = </td><td>€'.number_format($bruto_loon, 2, ', ', '.').'</td></tr>';
?>
$bruto_uurloon = 4.02;
$gewerkte_uren = 49.75;
$bruto_loon = $bruto_uurloon * $gewerkte_uren;
echo '<tr><td>Bruto loon:</td><td>'.$bruto_uurloon.' * '.$gewerkte_uren.' = </td><td>€'.number_format($bruto_loon, 2, ', ', '.').'</td></tr>';
?>
$bruto_loon zou volgens mijn rekenmachine 199.995, afgerond 200 dus, moeten zijn.
PHP zegt dat dit 199,99 is, wat doe ik verkeerd?
Mvg, Joost.
number_format($bruto_loon, 2, ', ', '.')
rond af op twee cijfers na de komma, dus PHP doet het goed. Gebruik liever de functie round().
rond af op twee cijfers na de komma, dus PHP doet het goed. Gebruik liever de functie round().
je rond nergens af, number_format kapt af als ik het goed heb.
$bruto_loon = round($bruto_uurloon * $gewerkte_uren);
$bruto_loon = round($bruto_uurloon * $gewerkte_uren);
Gewijzigd op 31/05/2010 22:10:35 door - Mark -
round($bruto_loon, 2) geeft precies hetzelfde resultaat.
Edit, dat van Mark werkte wel, thnx :)
Edit, dat van Mark werkte wel, thnx :)
Gewijzigd op 31/05/2010 22:10:45 door Joost van der Meijden
PHP zegt helemaal niet dat het 199,99
PHP 5.2.13
Met ander woorden, je doet niets fout
PHP 5.2.13
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$bruto_uurloon = 4.02;
$gewerkte_uren = 49.75;
$bruto_loon = $bruto_uurloon * $gewerkte_uren;
echo '<tr><td>Bruto loon:</td><td>'.$bruto_uurloon.' * '.$gewerkte_uren.' = </td><td>€'.number_format($bruto_loon, 2, ', ', '.').'</td></tr>';
?>
$bruto_uurloon = 4.02;
$gewerkte_uren = 49.75;
$bruto_loon = $bruto_uurloon * $gewerkte_uren;
echo '<tr><td>Bruto loon:</td><td>'.$bruto_uurloon.' * '.$gewerkte_uren.' = </td><td>€'.number_format($bruto_loon, 2, ', ', '.').'</td></tr>';
?>
Met ander woorden, je doet niets fout
Edit:
number_format behoort volgens de regels af te ronden
number_format behoort volgens de regels af te ronden
Gewijzigd op 31/05/2010 22:14:44 door Noppes Homeland
Bij mij geeft number_format(4.02 * 49.75, 2, ',', '') gewoon 200,00, dus tsja, weinig aan te zien.
Werk je toevallig op een 64-bits systeem? Dat geeft vaak dit soort problemen.
Werk je toevallig op een 64-bits systeem? Dat geeft vaak dit soort problemen.
Joost van der Meijden op 31/05/2010 22:12:42:
Met jouw code krijg ik toch echt 199,99 als uitkomst hoor ...
Noppes Homeland op 31/05/2010 22:09:43:
PHP zegt helemaal niet dat het 199,99
Met ander woorden, je doet niets fout
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$bruto_uurloon = 4.02;
$gewerkte_uren = 49.75;
$bruto_loon = $bruto_uurloon * $gewerkte_uren;
echo '<tr><td>Bruto loon:</td><td>'.$bruto_uurloon.' * '.$gewerkte_uren.' = </td><td>€'.number_format($bruto_loon, 2, ', ', '.').'</td></tr>';
?>
$bruto_uurloon = 4.02;
$gewerkte_uren = 49.75;
$bruto_loon = $bruto_uurloon * $gewerkte_uren;
echo '<tr><td>Bruto loon:</td><td>'.$bruto_uurloon.' * '.$gewerkte_uren.' = </td><td>€'.number_format($bruto_loon, 2, ', ', '.').'</td></tr>';
?>
Met ander woorden, je doet niets fout
Edit:
number_format behoort volgens de regels af te ronden
number_format behoort volgens de regels af te ronden
Met jouw code krijg ik toch echt 199,99 als uitkomst hoor ...
Edit:
Kheb een iMac, en volgensmij is dat 64BIT ja, maar het werkt nu iig :)
Kheb een iMac, en volgensmij is dat 64BIT ja, maar het werkt nu iig :)
Edit:
Het werkt toch niet helemaal zoals ik wil, nu rond hij het gewoon af naar een heel getal, ik wil gewoon dat als er meer dan 3 decimalen achter de komma staan, dat hij dat dan op 2 decimalen afrond.
Hoe kan ik dit dan het beste doen?
Het werkt toch niet helemaal zoals ik wil, nu rond hij het gewoon af naar een heel getal, ik wil gewoon dat als er meer dan 3 decimalen achter de komma staan, dat hij dat dan op 2 decimalen afrond.
Hoe kan ik dit dan het beste doen?
Gewijzigd op 31/05/2010 22:18:53 door Joost van der Meijden
Het is niet mijn code, het is jouw code, copy pasta en run
Maar zie de opmerking van Richard.
Maar zie de opmerking van Richard.
Edit:
wat voor resultaat krijg je met sprintf of printf
wat voor resultaat krijg je met sprintf of printf
Gewijzigd op 31/05/2010 23:02:24 door Noppes Homeland
floor?
Noppes Homeland op 31/05/2010 22:18:01:
Edit:
wat voor resultaat krijg je met sprintf of printf
wat voor resultaat krijg je met sprintf of printf
Inderdaad, je moet effe naar die twee kijken. Dat kan ook nogal een verschil maken.
Jij denkt dat je bijvoorbeeld gewoon 2 hebt, maar in feite is het intern 2.00001 of 1.999999999, volgens mij was dat dus het probleem.
Als je daar dan steeds mee verder rekent krijg je een 'heel groot' verschil uiteindelijk.
Met floor krijg ik 199
Met printf & sprintf krijg ik 199.99
Met printf & sprintf krijg ik 199.99
Weet je eigenlijk wel waar je mee bezig bent? Heb je php.net al eens bekeken?
Je zou zien dat floor gewoon sowieso 199 ging returnen..
Lees/leer eerst eens verder en probeer het dan nog een keer, want nu zit je gewoon lukraak functies uit te voeren waar je helemaal niet van snapt waar ze voor dienen, en dat zal je geen stap verder helpen.
Je zou zien dat floor gewoon sowieso 199 ging returnen..
Lees/leer eerst eens verder en probeer het dan nog een keer, want nu zit je gewoon lukraak functies uit te voeren waar je helemaal niet van snapt waar ze voor dienen, en dat zal je geen stap verder helpen.
Als ik het laat uitrekenen door PHP krijg ik om precies te zijn: 199,99499999999994770405464805662631988525390625. En volgens mij moet dat correct afgerond worden op 199,99 (aangezien het derde getal achter de komma een 4 is).
Als ik het PHP laat afronden is het 200,00.
Als ik het PHP laat afronden is het 200,00.
Dat komt omdat je volgens de wiskunde dat je van achter moet beginnen dus bij die 9 achter de 4 die je 4 een 5 en de 5 rond hij naar boven af. dan moet je iets maken dat hij alleen de eerste 3 cijfers achter de komma meerekend.
Bij mijn weten kijk je bij afronden naar het eerst volgende cijfer na het punt tot waar je wilt afronden. Dus in het geval van het getal van Elwin zou je bij afronden op 2 decimalen inderdaad 199.99 verwachten en geen 200.00.
Het lijkt mij eerder een bugje in de round() functie van PHP te zijn. Zie het verschil:
@Jo: wat jij zegt is volgens mij onzin. Dat zou betekenten dat je oneindige getallen (zoals pi bijvoorbeeld) nooit kunt afronden omdat je het laatste getal niet weet.
Het lijkt mij eerder een bugje in de round() functie van PHP te zijn. Zie het verschil:
Code (php)
@Jo: wat jij zegt is volgens mij onzin. Dat zou betekenten dat je oneindige getallen (zoals pi bijvoorbeeld) nooit kunt afronden omdat je het laatste getal niet weet.
Je hebt gelijk ik kom ook 199.99 uit het zal een foutje zijn in php of elwin zal het verkeerd gelezen hebben




