[php] Raar afrondingsprobleempje met floats

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ebas
  • Registratie: Maart 2001
  • Laatst online: 20-04-2017
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

function calc($n) {
  $euros = floor($n);
  $cents = round(($n-$euros)*100);
  return "&euro; $euros,$cents";
}

$x = floatval(16.50*1.19);
$y = floatval(19.635);

echo 'var_dump($x): ';
var_dump($x);
echo '<br />';

echo 'var_dump($y): ';
var_dump($y);
echo '<br /><br />';

echo 'calc($x): '.calc($x).'<br />';
echo 'calc($y): '.calc($y).'<br />';

?>


Output:
var_dump($x): float(19.635)
var_dump($y): float(19.635)

calc($x): € 19,63
calc($y): € 19,64

*zucht* iemand een idee? (ook hoe ik dit wél kan laten werken, al is het met een workaround...

Acties:
  • 0 Henk 'm!

  • Prutser_IA
  • Registratie: Januari 2000
  • Laatst online: 03-06-2021

Prutser_IA

<*{{{><

Heb dezelfde berekening ook in excel gedaan, en die geeft precies hetzelfde als php terug (dus 19.63 en 19.64). Je zou zeggen dat het komt doordat je die ene waarde uit een som haalt ( 16.50*1.19).

Wat is precies je bedoeling van de functie calc.. Het lijkt dat het enige wat hij doet is het afronden van een float naar een getal met 2 decimalen. Dit kan ook gewoon met de functie round()

$x = round( (float)16.50*1.19, 2);

Maar het "afrondingsprobleem" schijnt dus wel te kloppen ;)

42


Acties:
  • 0 Henk 'm!

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 20:03
Dit heeft te maken met de berekeningen op processor-niveau. Daarom heeft zowel Excel als PHP als (alle) andere programma's er last van. Volgens mij heb ik hier lang geleden ook een topic over gezien, ook met oplossing... even zoeken!

Hier dus: [rml][ php] number_format foute afronding 2.495 & 12.495[/rml]

[ Voor 15% gewijzigd door sjroorda op 12-10-2004 13:41 ]


Acties:
  • 0 Henk 'm!

  • Prutser_IA
  • Registratie: Januari 2000
  • Laatst online: 03-06-2021

Prutser_IA

<*{{{><

Er word in het commentaar van de functie round() gesproken over de volgende oplossing:

PHP:
1
2
3
4
5
6
function calc($n) {
  $euros = floor($n);
  $cents = round(($n-$euros)*2,2)/2;
  $cents = round($cents*100);
  return "&euro; $euros,$cents";
}


In excel lijkt dat inderdaad te werken (je krijg 19.64).. Weet niet of het altijd dus werkt.. dat zou je in praktijk moeten testen

[ Voor 6% gewijzigd door Prutser_IA op 12-10-2004 13:57 . Reden: je moet hem ook weer delen natuurlijk.... ]

42


Acties:
  • 0 Henk 'm!

  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 20-09 21:57

JaWi

maak het maar stuk hoor...

De theorie achter deze afronding-problemen (zoals vandaag nog gezien op PerlMonks):

What Every Computer Scientist Should Know About Floating-Point Arithmetic.

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.