(PHP 4, PHP 5, PHP 7, PHP 8)
round —Rounds a float
Returns the rounded value ofnum
to specifiedprecision
(number of digits after the decimal point).precision
can also be negative or zero (default).
num
The value to round.
precision
The optional number of decimal digits to round to.
If theprecision
is positive,num
is rounded toprecision
significant digits after the decimal point.
If theprecision
is negative,num
is rounded toprecision
significant digits before the decimal point, i.e. to the nearest multiple ofpow(10, -$precision)
, e.g. for aprecision
of -1num
is rounded to tens, for aprecision
of -2 to hundreds, etc.
mode
UseRoundingMode or one of the following constants to specify the mode in which rounding occurs.
Constants | Description |
---|---|
PHP_ROUND_HALF_UP | Roundsnum away from zero when it is half way there, making 1.5 into 2 and -1.5 into -2. |
PHP_ROUND_HALF_DOWN | Roundsnum towards zero when it is half way there, making 1.5 into 1 and -1.5 into -1. |
PHP_ROUND_HALF_EVEN | Roundsnum towards the nearest even value when it is half way there, making both 1.5 and 2.5 into 2. |
PHP_ROUND_HALF_ODD | Roundsnum towards the nearest odd value when it is half way there, making 1.5 into 1 and 2.5 into 3. |
The value rounded to the givenprecision
as afloat.
The function throws aValueError ifmode
is invalid. Prior to PHP 8.4.0, an invalid mode would silently default toPHP_ROUND_HALF_UP
.
Version | Description |
---|---|
8.4.0 | Four new rounding modes have been added. |
8.4.0 | Now throws aValueError ifmode is invalid. |
8.0.0 | num no longer accepts internal objects which support numeric conversion. |
Example #1round() examples
<?php
var_dump(round(3.4));
var_dump(round(3.5));
var_dump(round(3.6));
var_dump(round(3.6,0));
var_dump(round(5.045,2));
var_dump(round(5.055,2));
var_dump(round(345, -2));
var_dump(round(345, -3));
var_dump(round(678, -2));
var_dump(round(678, -3));
?>
The above example will output:
float(3)float(4)float(4)float(4)float(5.05)float(5.06)float(300)float(0)float(700)float(1000)
Example #2 Howprecision
affects a float
<?php
$number=135.79;
var_dump(round($number,3));
var_dump(round($number,2));
var_dump(round($number,1));
var_dump(round($number,0));
var_dump(round($number, -1));
var_dump(round($number, -2));
var_dump(round($number, -3));
?>
The above example will output:
float(135.79)float(135.79)float(135.8)float(136)float(140)float(100)float(0)
Example #3mode
examples
<?php
echo'Rounding modes with 9.5'.PHP_EOL;
var_dump(round(9.5,0,PHP_ROUND_HALF_UP));
var_dump(round(9.5,0,PHP_ROUND_HALF_DOWN));
var_dump(round(9.5,0,PHP_ROUND_HALF_EVEN));
var_dump(round(9.5,0,PHP_ROUND_HALF_ODD));
echoPHP_EOL;
echo'Rounding modes with 8.5'.PHP_EOL;
var_dump(round(8.5,0,PHP_ROUND_HALF_UP));
var_dump(round(8.5,0,PHP_ROUND_HALF_DOWN));
var_dump(round(8.5,0,PHP_ROUND_HALF_EVEN));
var_dump(round(8.5,0,PHP_ROUND_HALF_ODD));
?>
The above example will output:
Rounding modes with 9.5float(10)float(9)float(10)float(9)Rounding modes with 8.5float(9)float(8)float(8)float(9)
Example #4mode
withprecision
examples
<?php
echo'Using PHP_ROUND_HALF_UP with 1 decimal digit precision'.PHP_EOL;
var_dump(round(1.55,1,PHP_ROUND_HALF_UP));
var_dump(round(-1.55,1,PHP_ROUND_HALF_UP));
echoPHP_EOL;
echo'Using PHP_ROUND_HALF_DOWN with 1 decimal digit precision'.PHP_EOL;
var_dump(round(1.55,1,PHP_ROUND_HALF_DOWN));
var_dump(round(-1.55,1,PHP_ROUND_HALF_DOWN));
echoPHP_EOL;
echo'Using PHP_ROUND_HALF_EVEN with 1 decimal digit precision'.PHP_EOL;
var_dump(round(1.55,1,PHP_ROUND_HALF_EVEN));
var_dump(round(-1.55,1,PHP_ROUND_HALF_EVEN));
echoPHP_EOL;
echo'Using PHP_ROUND_HALF_ODD with 1 decimal digit precision'.PHP_EOL;
var_dump(round(1.55,1,PHP_ROUND_HALF_ODD));
var_dump(round(-1.55,1,PHP_ROUND_HALF_ODD));
?>
The above example will output:
Using PHP_ROUND_HALF_UP with 1 decimal digit precisionfloat(1.6)float(-1.6)Using PHP_ROUND_HALF_DOWN with 1 decimal digit precisionfloat(1.5)float(-1.5)Using PHP_ROUND_HALF_EVEN with 1 decimal digit precisionfloat(1.6)float(-1.6)Using PHP_ROUND_HALF_ODD with 1 decimal digit precisionfloat(1.5)float(-1.5)
Example #5 Example of usingRoundingMode
<?php
foreach (RoundingMode::cases() as$mode) {
foreach ([
8.5,
9.5,
-3.5,
] as$number) {
printf("%-17s: %+.17g -> %+.17g\n",$mode->name,$number,round($number,0,$mode));
}
echo"\n";
}
?>
The above example will output:
HalfAwayFromZero : +8.5 -> +9HalfAwayFromZero : +9.5 -> +10HalfAwayFromZero : -3.5 -> -4HalfTowardsZero : +8.5 -> +8HalfTowardsZero : +9.5 -> +9HalfTowardsZero : -3.5 -> -3HalfEven : +8.5 -> +8HalfEven : +9.5 -> +10HalfEven : -3.5 -> -4HalfOdd : +8.5 -> +9HalfOdd : +9.5 -> +9HalfOdd : -3.5 -> -3TowardsZero : +8.5 -> +8TowardsZero : +9.5 -> +9TowardsZero : -3.5 -> -3AwayFromZero : +8.5 -> +9AwayFromZero : +9.5 -> +10AwayFromZero : -3.5 -> -4NegativeInfinity : +8.5 -> +8NegativeInfinity : +9.5 -> +9NegativeInfinity : -3.5 -> -4PositiveInfinity : +8.5 -> +9PositiveInfinity : +9.5 -> +10PositiveInfinity : -3.5 -> -3
In my opinion this function lacks two flags:
- PHP_ROUND_UP - Always round up.
- PHP_ROUND_DOWN - Always round down.
In accounting, it's often necessary to always round up, or down to a precision of thousandths.
<?php
functionround_up($number,$precision=2)
{
$fig= (int)str_pad('1',$precision,'0');
return (ceil($number*$fig) /$fig);
}
functionround_down($number,$precision=2)
{
$fig= (int)str_pad('1',$precision,'0');
return (floor($number*$fig) /$fig);
}
?>
As PHP doesn't have a a native number truncate function, this is my solution - a function that can be usefull if you need truncate instead round a number.
<?php
/**
* Truncate a float number, example: <code>truncate(-1.49999, 2); // returns -1.49
* truncate(.49999, 3); // returns 0.499
* </code>
* @param float $val Float number to be truncate
* @param int f Number of precision
* @return float
*/
functiontruncate($val,$f="0")
{
if(($p=strpos($val,'.')) !==false) {
$val=floatval(substr($val,0,$p+1+$f));
}
return$val;
}
?>
Originally posted inhttp://stackoverflow.com/a/12710283/1596489
If you have negative zero and you need return positive number simple add +0:
$number = -2.38419e-07;
var_dump(round($number,1));//float(-0)
var_dump(round($number,1) + 0);//float(0)
Unexpected result or misunderstanding (php v5.5.9)
<?php
echoround(1.55,1,PHP_ROUND_HALF_DOWN);// 1.5
echoround(1.551,1,PHP_ROUND_HALF_DOWN);//1.6
?>
I discovered that under some conditions you can get rounding errors with round when converting the number to a string afterwards.
To fix this I swapped round() for number_format().
Unfortunately i cant give an example (because the number cant be represented as a string !)
essentially I had round(0.688888889,2);
which would stay as 0.68888889 when printed as a string.
But using number_format it correctly became 0.69.
function mround($val, $f=2, $d=6){
return sprintf("%".$d.".".$f."f", $val);
}
echo mround(34.89999); //34.90
Here is function that rounds to a specified increment, but always up. I had to use it for price adjustment that always went up to $5 increments.
<?php
functionroundUpTo($number,$increments) {
$increments=1/$increments;
return (ceil($number*$increments) /$increments);
}
?>
If you'd only want to round for displaying variables (not for calculating on the rounded result) then you should use printf with the float:
<?php printf("%6.2f",3.39532);?>
This returns: 3.40 .
this function (as all mathematical operators) takes care of the setlocale setting, resulting in some weirdness when using the result where the english math notation is expected, as the printout of the result in a width: style attribute!
<?php
$a=3/4;
echoround($a,2);// 0.75
setlocale(LC_ALL,'it_IT@euro','it_IT','it');
$b=3/4;
echoround($b,2);// 0,75
?>
This function will let you round to an arbitrary non-zero number. Zero of course causes a division by zero.
<?php
functionroundTo($number,$to){
returnround($number/$to,0)*$to;
}
echoroundTo(87.23,20);//80
echoroundTo(-87.23,20);//-80
echoroundTo(87.23,.25);//87.25
echoroundTo(.23,.25);//.25
?>
/**
* Round to first significant digit
* +N to +infinity
* -N to -infinity
*
*/
function round1stSignificant ( $N ) {
if ( $N === 0 ) {
return 0;
}
$x = floor ( log10 ( abs( $N ) ) );
return ( $N > 0 )
? ceil( $N * pow ( 10, $x * -1 ) ) * pow( 10, $x )
: floor( $N * pow ( 10, $x * -1 ) ) * pow( 10, $x );
}
echo round1stSignificant( 39144818 ) . PHP_EOL;
echo round1stSignificant( 124818 ) . PHP_EOL;
echo round1stSignificant( 0.07468 ) . PHP_EOL;
echo round1stSignificant( 0 ) . PHP_EOL;
echo round1stSignificant( -0.07468 ) . PHP_EOL;
/**
* Output
*
* 40000000
* 200000
* 0.08
* 0
* -0.08
*
*/
round() will sometimes return E notation when rounding a float when the amount is small enough - seehttps://bugs.php.net/bug.php?id=44223 . Apparently it's a feature.
To work around this "feature" when converting to a string, surround your round statement with an sprintf:
sprintf("%.10f", round( $amountToBeRounded, 10));
Here's a function to round to an arbitary number of significant digits. Don't confuse it with rounding to a negative precision - that counts back from the decimal point, this function counts forward from the Most Significant Digit.
ex:
<?php
round(1241757, -3);// 1242000
RoundSigDigs(1241757,3);// 1240000
?>
Works on negative numbers too. $sigdigs should be >= 0
<?php
functionRoundSigDigs($number,$sigdigs) {
$multiplier=1;
while ($number<0.1) {
$number*=10;
$multiplier/=10;
}
while ($number>=1) {
$number/=10;
$multiplier*=10;
}
returnround($number,$sigdigs) *$multiplier;
}
?>