Bug #54985 [Bgs]: round doesn't work with non-14 precision

From: Date: Sat, 11 Jun 2011 13:20:23 +0000
Subject: Bug #54985 [Bgs]: round doesn't work with non-14 precision
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-161303@lists.php.net to get a copy of this message
Edit report at http://bugs.php.net/bug.php?id=54985&edit=1

 ID:                 54985
 User updated by:    jille at hexon dot cx
 Reported by:        jille at hexon dot cx
 Summary:            round doesn't work with non-14 precision
 Status:             Bogus
 Type:               Bug
 Package:            *Math Functions
 Operating System:   n/a
 PHP Version:        5.3.6
 Assigned To:        cataphract
 Block user comment: N
 Private report:     N

 New Comment:

I disagree with that this behaviour is correct. I think there should be a 
function which can round() in a reliable way. If it isn't possible with floats I 
think there should be a function which returns a string.


Previous Comments:
------------------------------------------------------------------------
[2011-06-11 04:00:55] cataphract@php.net

This is a bogus report (.055 is not exactly representable, the closest is 7926335344172073*2^-57);
r301991 did introduce a bug, but it's completely unrelated.

------------------------------------------------------------------------
[2011-06-10 20:10:39] cataphract@php.net

Seems to have been introduced by the fix to bug #52550 (r301991).

------------------------------------------------------------------------
[2011-06-03 16:10:14] jille at hexon dot cx

Description:
------------
Round() doesn't work right when the precision is set to e.g. 16.

The last comment in #51701 also makes notice of this. (However it seems unrelated to that
bugreport.)

Bug #5500 states that you shouldn't set the precision higher than the data-type can hold. If
that's still true I think we should add a warning when setting the precision too high instead
of just accepting it and trying to work it out.

_php_math_round in ext/standard/math.c cites:
  if ((precision_places = php_intlog10abs(value)) > 0) {
    precision_places = 14 - php_intlog10abs(value);
  } else {
    precision_places = 14;
  }

and I guess 14 shouldn't be hardcoded there.

Test script:
---------------
php > ini_set('precision', 30);
php > var_dump(round((5.5/100), 3));

Expected result:
----------------
float(0.055)


Actual result:
--------------
float(0.0550000000000000002775557561563)



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



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


Thread (8 messages)

« previous php.bugs (#161303) next »