Avatar billede dallan2007 Nybegynder
28. december 2012 - 09:44 Der er 5 kommentarer og
1 løsning

Problem med simpel afrunding

Jeg har et simpelt tal som ikke rigtig gider at afrunde korrekt:

$tal = 4886.94 * 1.25;
$tal = round($tal,2);
echo "Test 2: ".$tal."<br />";

Det giver 6108.675 men afrunder til 6108.67 i stedet for .68. How so?
Avatar billede alphabits Nybegynder
28. december 2012 - 10:27 #1
Du kan få den til at afrunde som du ønsker ved at kalde round med den tredje parameter sat til konstanten PHP_ROUND_HALF_DOWN:

$tal = round($tal, 2, PHP_ROUND_HALF_DOWN);
Avatar billede alphabits Nybegynder
28. december 2012 - 10:34 #2
OK, fik vist lige byttet rundt på tingene i mit forrige svar.

Hvilken version af php bruger du?
Avatar billede dallan2007 Nybegynder
28. december 2012 - 11:13 #3
Du har (desværre) helt ret: http://stackoverflow.com/questions/14066965/php-how-to-round-up-correctly

Og jeg bruger version 5.2.17 så jeg bliver nød til at lave et uskønt hack:

$number = substr($number,0,strpos($number,".")+4); 
$number = round($number,2);

Men det ser da ud til at virke.
Avatar billede michael_stim Ekspert
28. december 2012 - 11:13 #4
Du er ikke den eneste:


the result of this function always depends on the underlying C function. There have been a lot of compiler bugs and floating-point precission problems involving this function. Right now the following code:

<?php
echo round(141.075, 2);
?>

returns:

141.07

on my machine.
So never really trust this function when you do critical calculations like accounting stuff!
Instead: use only integers or use string comparisons.


Taget fra:
http://dk1.php.net/round
Avatar billede arne_v Ekspert
31. december 2012 - 03:43 #5
Jeg har en grim mistanke om at en del laesere af denne traad vil misse den rigtige pointe.

4886.94 * 1.25 afrundet til 2 decimaler er  6108.67

141.075 afrundet til 2 decimaler er 141.07

Vi snakker floating point her.

Man kan ikke repraesentere decimaler eksakt i floating point.

Det matematiske tal 141.075 eksisterer ikke som floating point.

Det naermeste floating point tal er ca. 141.07499999999998863131622783839702606201171875 !

Og det skal jo rundes ned til 141.07 !!

Det falder den menneskelig logik lidt svaert saa programmoerne af diverse funktions biblioteker forsoeger at vaere hjaelpsomme og sige at hvis tallet er "meget taet paa" 141.075 saa skal det nok opfattes som dette og rundes op. Men det er jo ikke nogen veldefineret logik, saa derfor er det nogen gange "rigtig" og nogen gange "forkert".

Den rigtige konklusion er at der skal indfoeres doedsstraf for at bruge floating point til beloeb !!!!
Avatar billede dallan2007 Nybegynder
22. januar 2013 - 09:27 #6
4886.94 * 1.25 afrundet til 2 decimaler er  6108.67

141.075 afrundet til 2 decimaler er 141.07


Hvis vi snakker "normal" matematisk afrunding så skal det give hhv. 6108,68 og 141,08.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester