2.3. Rounding Floating-Point Numbers

Problem

You want to round a floating-point number, either to an integer value or to a set number of decimal places.

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

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

See Also

Recipe 2.3 for information on comparing floating-point numbers; documentation on round( ) at http://www.php.net/round ...

Get PHP Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.