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