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

 ID:               34427
 Comment by:       sonicpr at bol dot com dot br
 Reported by:      lukasz at knasiecki dot com
 Summary:          round function bug
 Status:           Bogus
 Type:             Bug
 Package:          Math related
 Operating System: Windows XP
 PHP Version:      5.0.5

 New Comment:

<?php



function myround($n,$p=0) {

        $div = pow(10,$p);

        $sign = ($n > 0) ? +0.5 : -0.5;

        return floor(0.000000000001 + ($sign + $div * $n))/$div;

}



echo round(9.5), ' => ', myround(9.5), chr(10); // 10 => 10

echo round(9.95,1), ' => ', myround(9.95,1), chr(10); // 10 => 10

echo round(9.995,2), ' => ', myround(9.995,2), chr(10); // 9.99 => 10

echo round(9.9995,3), ' => ', myround(9.9995,3), chr(10); // 10 => 10

echo round(9.99995,4), ' => ', myround(9.99995,4), chr(10); // 10 => 10



echo round(-9.5), ' => ', myround(-9.5), chr(10); // -10 => -10

echo round(-9.95,1), ' => ', myround(-9.95,1), chr(10); // -10 => -10

echo round(-9.995,2), ' => ', myround(-9.995,2), chr(10); // -9.99 =>
-10

echo round(-9.9995,3), ' => ', myround(-9.9995,3), chr(10); // -10 =>
-10

echo round(-9.99995,4), ' => ', myround(-9.99995,4), chr(10); // -10 =>
-10



echo round(8.155, 2), ' => ', myround(8.155, 2), chr(10); // 8.155 =>
8.16

/*

PHP 5.2.6-1+lenny6 with Suhosin-Patch 0.9.6.2 (cli) (built: Feb  9 2010
03:05:13)

Copyright (c) 1997-2008 The PHP Group

*/



?>


Previous Comments:
------------------------------------------------------------------------
[2005-09-08 14:45:57] lukasz at knasiecki dot com

Still, I am sure this is a bug. No software I use (Excel, Shopping
program) produces such results, like PHP



 echo '<br>'.round(0.155*1, 2);  >> gives 0,16

 echo '<br>'.round(8.155*1, 2);  >> gives 8,15

------------------------------------------------------------------------
[2005-09-08 14:32:09] tony2...@php.net

Floating point values have a limited precision. Hence a value might 
not have the same string representation after any processing. That also
includes writing a floating point value in your script and directly 
printing it without any mathematical operations.

If you would like to know more about "floats" and what IEEE
754 is read this:
http://docs.sun.com/source/806-3568/ncg_goldberg.html
 
Thank you for your interest in PHP.



------------------------------------------------------------------------
[2005-09-08 14:24:56] lukasz at knasiecki dot com

Description:
------------
Round function works with errors.

Reproduce code:
---------------
echo '<br>'.round(8.055, 2); 

echo '<br>'.round(8.155, 2); 

echo '<br>'.round(8.255, 2); 

Expected result:
----------------
echo '<br>'.round(8.055, 2); //gives 8.06

echo '<br>'.round(8.155, 2); //gives 8.16

echo '<br>'.round(8.255, 2); //gives 8.26



Actual result:
--------------
echo '<br>'.round(8.055, 2); //gives 8.06

echo '<br>'.round(8.155, 2); //gives 8.15 !!!

echo '<br>'.round(8.255, 2); //gives 8.26




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



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

Reply via email to