Recipe 2.4 Rounding Floating-Point Numbers
2.4.1 Problem
You want to round a floating-point
number, either to an integer value or to a set number of decimal
places.
2.4.2 Solution
To round a number to the closest integer, use round(
)
:
$number = round(2.4); // $number = 2
To round up, use ceil( ):
$number = ceil(2.4); // $number = 3
To round down, use floor( ):
$number = floor(2.4); // $number = 2
2.4.3 Discussion
If a number falls exactly between two integers, its behavior is
undefined:
$number = round(2.5); // $number is 2 or 3!
Be
careful! As we mention in Recipe 2.3,
floating-point numbers don't always work out to
exact values because of how they're stored
internally by the computer. This can create situations in which the
obvious answer isn't. A value you expect to have a
decimal part of "0.5" might instead
be ".499999...9" (with a whole
bunch of 9s) or ".500000...1" (with
many 0s and a trailing 1). If you want to ensure that a number is
rounded up as you might expect, add a small delta value to it before rounding:
$delta = 0.0000001;
$number = round(2.5 + $delta); // $number = 3
To keep a set number of digits after the decimal point,
round( ) accepts an optional precision argument.
For example, if you are calculating the total price for the items in
a user's shopping cart:
$cart = 54.23;
$tax = $cart * .05;
$total = $cart + $tax; // $total = 56.9415
$final = round($total, 2); // $final = 56.94
2.4.4 See Also
Recipe 2.3 for information on comparing
floating-point numbers; documentation on round( )
at http://www.php.net/round.
|