|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2003-06-12 02:28 UTC] 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
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Oct 30 22:00:01 2025 UTC |
hmm, actually this changed between PHP 4.2.2, PHP 4.2.3 an PHP 4.3.0: [derick@kossu 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)); ?> [derick@kossu derick]$ php-4.2.2 foo.php 5.04 [derick@kossu derick]$ php-4.2.3 foo.php 5.05zend_hash.c(98) : Bailed out without a bailout address! [derick@kossu derick]$ php-4.3.0 foo.php 5.05 [derick@kossu derick]$ php-4.3.0dev foo.php 5.05 [derick@kossu derick]$ php-5.0.0dev foo.php 5.04 So something is definitely screwed in the PHP_4_3 branch DerickWith this script: <?php $mul = 1; $one = 5; $two = 0.9; ini_set("precision", 24); $res = 5 * (1 + (0.9 / 100)); $bar = round($res, 2); $foo = round(1 * $bar, 2); echo $res, "\n", $bar, "\n", $foo, "\n"; echo sprintf("%1.2f", $foo); ?> Result with PHP 4.3.3-dev: 5.04499999999999992894573 5.04999999999999982236432 5.04999999999999982236432 5.05 Result with PHP 4.2.3: 5.04499999999999992894573 5.04000000000000003552714 5.04000000000000003552714 5.04 Nokia 6120 (the $res): 5.045 TI-32: 5.045 With pen and paper: 5.045 Round 5.045 with precision of 2 == 5.05 So I think PHP 4.3.2 actually works as expected and anything before (and after, PHP 5? :) doesn't. Reclassified as ZE2 bug.