PHP number_format() and a problem with negative values rounded to zero

As is known, the PHP function number_format() rounds the given value to the needed amount of decimal places.

E. g.:
$a = 2.658;
$x = number_format($a, 2); // --> 2.66
$x = number_format($a, 0); // --> 3

From my point of view, there is a poor side-effect when using negative numbers that should be round to 0 (zero).

E. g.:
$a = -0.00000003;
$x = number_format($a, 2); // --> -0.00
$x = number_format($a, 0); // --> -0

You see the minus sign in front of the output? This is espacially annoying when it occurs because of inaccuracy of the internal floating point operations inside PHP.

E. g.:
$a = 7.8;
$b = 7.79;
$c = 0.01;
$result = $a - $b - $c;
$x = number_format($result, 2); // --> -0.00

In this case the minus sign (-0.00) is a result of the fact, that the result is -0.00000000000000021337 due to floating point inaccuracy. However the result varies due to the settings of php.ini and the php version. In my tests I used PHP 5.3 with a floating point accuracy of 13 decimal places.

You can avoid this behaviour of number_format() easily by rounding the value to the needed decimal places just before passing it to the function.

E. g.:
$a = -0.00000003;
$x = number_format(round($a, 2), 2); // --> 0.00
$x = number_format(round($a, 0), 0); // --> 0

Share this page:

1 Comment(s)