[PHP] round() rondt niet af maar doet een floor()

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Anders
  • Registratie: December 2000
  • Laatst online: 13-09 18:52
Het volgende script:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
echo "<ul>";

echo "<li>round(3.4) = " . round(3.4);
echo "<li>round(3.5) = " . round(3.5);
echo "<li>round(3.6) = " . round(3.6);

echo "<li>round(3/5) = " . round(3/5);

echo "<li>round(3,6) = " . round(3,6);

echo "</ul>";

// ------------------------------------------

echo "<hr>";
printf("%.0f", 2/5);
echo "<br>";

printf("%.1f", 2/5);
echo "<br>";

printf("%.2f", 2/5);
echo "<br>";

// ------------------------------------------

echo "<hr>";
printf("%.0f", 3/6);
echo "<br>";

printf("%.1f", 3/6);
echo "<br>";

printf("%.2f", 3/6);
echo "<br>";


.. zou een resultaat moeten hebben zoals te zien is op http://www.paksoi.nl/test/round.php

Oftewel:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
round(3.4) = 3
round(3.5) = 4
round(3.6) = 4
round(3/5) = 1
round(3,6) = 3

--------------------------------------------------------------------------
0
0.4
0.40

--------------------------------------------------------------------------
1
0.5
0.50


Op mijn localhost krijg ik echter het volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
round(3.4) = 3
round(3.5) = 3
round(3.6) = 3
round(3/5) = 0
round(3,6) = 3

--------------------------------------------------------------------------
0
0.4
0.40

--------------------------------------------------------------------------
1
0.5
0.50


Ik gebruik PHP Version 4.3.3RC2-dev op een Apache server onder Windows XP. Ik kan niks vinden in de Changelogs of bug reports hierover... Ben ik nou gek, zie ik iets heel stoms over het hoofd of is die 4.3.3RC2-dev een beetje gaga? Met phpinfo() zie ik niks raars verschijnen waaruit ik het zou kunnen verklaren.

Ik spoor veilig of ik spoor niet.


Acties:
  • 0 Henk 'm!

  • iMars
  • Registratie: Augustus 2001
  • Laatst online: 01:38

iMars

Full time prutser

Tja, bij mij doet ie het wel goed.
Heb je script letterlijk copy/paste op mijn server gezet en kijk maar naar wat bij mij het resultaat is: link
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
round(3.4) = 3
round(3.5) = 4
round(3.6) = 4
round(3/5) = 1
round(3,6) = 3 (is een komma .. moet een punt zijn)

------------------------
0
0.4
0.40

------------------------
1
0.5
0.50


edit:
Mijn server is FreeBSD 4.9 met :
apache 1.3.31
bind 9.2.3
courier-imap 3.0.1
frontpage 5.0
mailman 2.0.13
mysql 3.23.58
postgresql 7.3.5
webalizer 2.1.10
php 4.3.4
mod_python 2.7.10
coldfusion Component was not installed
qmail 1.03
proftpd 1.2.9
logrotate 3.7
tomcat 4.1.29
spamassassin 2.61

Edit #2:
Op een oudere server van mij met PHP 4.2.2 krijg ik precies hetzelfde eruit.

Reactie op onderstaande reply:
Het gaat er volgens mij niet om hoeveel decimalen er moet worden weergegeven, maar het feit dat round(3.6) omlaag wordt afgerond, terwijl het in dit geval naar boven moet worden afgerond.

[ Voor 48% gewijzigd door iMars op 13-08-2004 09:09 ]

Koop hier mijn P1 reader :)


Acties:
  • 0 Henk 'm!

  • tato
  • Registratie: Juni 2003
  • Laatst online: 15-09 18:26
Als je round(); gebruikt zonder een tweede (optionele) parameter doet round(); hetzelfde als de floor(); functie. Mits je gebruikmaakt van die tweede parameter, ook een integer. Hiermee kan je bepalen hoeveel getallen achter de komma/punt moet laten zien/afronden.
PHP:
1
2
3
4
5
<?php

echo round( 3.14, 1); # Weergeeft op het scherm 3.1

?>

[ Voor 4% gewijzigd door tato op 13-08-2004 09:04 . Reden: Verkeerde tags ]


Acties:
  • 0 Henk 'm!

  • Anders
  • Registratie: December 2000
  • Laatst online: 13-09 18:52
M.a.w. round(9/10) = 0, wil je zeggen? Dan doet elke webserver ter wereld het fout, en is mijn localhost de enige die het goed doet. Lijkt me erg stug. Bovendien is de PHP manual erg duidelijk: round()
Returns the rounded value of val to specified precision (number of digits after the decimal point). precision can also be negative or zero (default).
Zero = default, en dan geeft ie dus gewoon een rounded value terug. Geen floor.

Ik spoor veilig of ik spoor niet.


Acties:
  • 0 Henk 'm!

Verwijderd

Vrûûger in BASIC moest je altijd zó afronden:

code:
1
  VAL = INT(VAL + 0.5)


Als het erg dringend is zou je dat nog kunnen proberen met floor. Maar het is tamelijk raar...

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Ik zou sowieso upgraden naar een nieuwere php-versie. Een RC-dev is geen garantie op perfect gedrag.
Verder meen ik te herinneren dat er wel es problemen met round geweest zijn, maar wanneer weet ik niet meer.

En als laatste heb je kans dat je een nederlandse locale hebt en je dus officieel 3,6 moet neerzetten ipv 3.6. Daar heb ik een tijd terug een keer een bug in ontdekt, omdat ie wel vond dat je 3,6 moest gebruiken als getal, maar het dan verder zelf niet goed verwerkte in de php-compiler/parser :X Ook dat zou in latere php-versies opgelost moeten zijn.

Acties:
  • 0 Henk 'm!

  • iMars
  • Registratie: Augustus 2001
  • Laatst online: 01:38

iMars

Full time prutser

ACM schreef op 13 augustus 2004 @ 09:19:
Ik zou sowieso upgraden naar een nieuwere php-versie. Een RC is geen garantie op perfect gedrag.
Verder meen ik te herinneren dat er wel es problemen met round geweest zijn, maar wanneer weet ik niet meer.

En als laatste heb je kans dat je een nederlandse locale hebt en je dus officieel 3,6 moet neerzetten ipv 3.6. Daar heb ik een tijd terug een keer een bug in ontdekt, omdat ie wel vond dat je 3,6 moest gebruiken als getal, maar het dan verder zelf niet goed verwerkte in de php-compiler/parser :X Ook dat zou in latere php-versies opgelost moeten zijn.
Hij heeft er ook een 3,6 staan, maakt ie mooi 3 van :P

MAar idd, denk dat het beste is om te updaten naar een van de laatste versie's

Koop hier mijn P1 reader :)


Acties:
  • 0 Henk 'm!

  • Anders
  • Registratie: December 2000
  • Laatst online: 13-09 18:52
Tsja, die 3,6 (komma) staat er ook tussen, maar dat is 'm ook niet. Ik ga de hele mik inderdaad gewoon maar upgraden want dit gaat elke redelijkheid te boven.

/edit - en met zowel 4.3.8 als 5.0.0 doet ie het als een zonnetje.

Allen bedankt voor de moeite.

[ Voor 26% gewijzigd door Anders op 13-08-2004 10:22 ]

Ik spoor veilig of ik spoor niet.


Acties:
  • 0 Henk 'm!

  • paulh
  • Registratie: Juli 1999
  • Laatst online: 18-09 20:05
ACM schreef op 13 augustus 2004 @ 09:19:

En als laatste heb je kans dat je een nederlandse locale hebt en je dus officieel 3,6 moet neerzetten ipv 3.6. Daar heb ik een tijd terug een keer een bug in ontdekt, omdat ie wel vond dat je 3,6 moest gebruiken als getal, maar het dan verder zelf niet goed verwerkte in de php-compiler/parser :X Ook dat zou in latere php-versies opgelost moeten zijn.
Dat is denk ik alleen als je gebroken getallen gebruikt binnen in een string en die probeert te converteren naar een elementair type. Anders is de code gewoon weg niet compileerbaar te krijgen.

[ZwareMetalen.com] - [Kom in aktie tegen de CO2 maffia]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

webmail schreef op 13 augustus 2004 @ 09:21:
Hij heeft er ook een 3,6 staan, maakt ie mooi 3 van :P

MAar idd, denk dat het beste is om te updaten naar een van de laatste versie's
Die 3,6 leest ie als "het getal 3, afronden op 6 decimalen" lijkt me. Als het echt een fout met de locale was, dan had je eigenlijk dit eens moeten proberen:
PHP:
1
echo round({3,6});

Op deze manier zou ie het getal als 3.6 moeten zien en op 0 decimalen afronden. In theorie dan, want zou niet weten hoe ik dat gedrag kan checken. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1