ID:               24142
 Updated by:       [EMAIL PROTECTED]
 Reported By:      infohata at firmos dot net
-Status:           Bogus
+Status:           Open
-Bug Type:         *Math Functions
+Bug Type:         Scripting Engine problem
 Operating System: Linux
 PHP Version:      4.3.2
 New Comment:

hmm, actually this changed between PHP 4.2.2, PHP 4.2.3 an PHP 4.3.0:

[EMAIL PROTECTED] derick]$ cat foo.php   
<?php
$mul = 1;
$one = 5;
$two = 0.9;

echo sprintf("%1.2f", round($mul * round($one * (1 + ($two / 100)), 2),
2));
?>

[EMAIL PROTECTED] derick]$ php-4.2.2 foo.php 
5.04

[EMAIL PROTECTED] derick]$ php-4.2.3 foo.php 
5.05zend_hash.c(98) : Bailed out without a bailout address!

[EMAIL PROTECTED] derick]$ php-4.3.0 foo.php 
5.05

[EMAIL PROTECTED] derick]$ php-4.3.0dev foo.php 
5.05

[EMAIL PROTECTED] derick]$ php-5.0.0dev foo.php 
5.04

So something is definitely screwed in the PHP_4_3 branch

Derick


Previous Comments:
------------------------------------------------------------------------

[2003-06-12 02:45:09] [EMAIL PROTECTED]

This is expected behaviour.  When rounding on exact halves we round
down on evens and up on odds.  If you want to always force it in one
direction on a .5 (or .05 in your case) add or substract a tiny fuzz
factor.  The reason behind rounding half the values down and the other
half up is to avoid the classical banking problem where if you always
rounded down you would be stealing money from your customers, or if you
always rounded up you would end up over time losing money.  By
averaging it out through evens and odds you statistically break even. 
If you want to learn more, search the web for terms such as "round to
even" or "banker's rounding" and you will find that most languages
actually do it this way.

------------------------------------------------------------------------

[2003-06-12 02:28:26] infohata at firmos dot net

Description:
------------
I am using a webhosting service of bbdsoft (www.firmos.net) so I don't
know exact OS and configuration of PHP.INI, but this bug is
independent of any config or OS, it's about round() function - it has a
big bug rounding floats!!

All the details and what's have to be is written below in the source
code and it's comments:)

Well, I saw other reports, and I think YOU SHOULD FIX THIS IN ANY CASE
AND AS FAST AS POSSIBLE!!!

Reproduce code:
---------------
// at the start of the return code these variables has values:
$skerd_svoris = 1;
$rows_kriu_kain00[0] = 5;
$rows_kriu_kkoef[0] = 0.9;

// return code:
return sprintf("%1.2f",
round($skerd_svoris*round($rows_kriu_kain00[0]*(1+($rows_kriu_kkoef[0]/100)),
2), 2));

// if the code is changed to:
// return sprintf("%1.2f",
round($skerd_svoris*round($rows_kriu_kain00[0]*(1+($rows_kriu_kkoef[0]/100))+0.000001,
2), 2));
// all goes OK; so the problem is that if the number is 5.045, rounded
it will be 5.04, but if it is 5.045001 - rounded it will be 5.05. I
think You understood what I want to say:)

Expected result:
----------------
5.05

Actual result:
--------------
5.04


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=24142&edit=1

Reply via email to