round

(PHP 4, PHP 5, PHP 7)

roundОкругляет число типа float

Описание

float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )

Возвращает округлённое значение val с указанной точностью precision (количество цифр после запятой). Последняя может быть отрицательной или нулём (по умолчанию).

Замечание: PHP по умолчанию не может правильно обрабатывать строки типа "12,300.2". Для подробностей см. Преобразование строк в числа.

Список параметров

val

Значение для округления

precision

Количество десятичных знаков, до которых округлять

mode

Используйте одну из этих констант для задания способа округления.

Константа Описание
PHP_ROUND_HALF_UP Округляет val в большую сторону от нуля до precision десятичных знаков, если следующий знак находится посередине. Т.е. округляет 1.5 в 2 и -1.5 в -2.
PHP_ROUND_HALF_DOWN Округляет val в меньшую сторону к нулю до precision десятичных знаков, если следующий знак находится посередине. Т.е. округляет 1.5 в 1 и -1.5 в -1.
PHP_ROUND_HALF_EVEN Округляет val до precision десятичных знаков в сторону ближайшего четного знака.
PHP_ROUND_HALF_ODD Округляет val до precision десятичных знаков в сторону ближайшего нечетного знака.

Возвращаемые значения

Округленное значение

Примеры

Пример #1 Пример использования round()

<?php
echo round(3.4);         // 3
echo round(3.5);         // 4
echo round(3.6);         // 4
echo round(3.60);      // 4
echo round(1.955832);  // 1.96
echo round(1241757, -3); // 1242000
echo round(5.0452);    // 5.05
echo round(5.0552);    // 5.06
?>

Пример #2 Примеры использования параметра mode

<?php
echo round(9.50PHP_ROUND_HALF_UP);   // 10
echo round(9.50PHP_ROUND_HALF_DOWN); // 9
echo round(9.50PHP_ROUND_HALF_EVEN); // 10
echo round(9.50PHP_ROUND_HALF_ODD);  // 9

echo round(8.50PHP_ROUND_HALF_UP);   // 9
echo round(8.50PHP_ROUND_HALF_DOWN); // 8
echo round(8.50PHP_ROUND_HALF_EVEN); // 8
echo round(8.50PHP_ROUND_HALF_ODD);  // 9
?>

Пример #3 Примеры использования параметра mode с указанием точности

<?php
/* Использование PHP_ROUND_HALF_UP с точностью до 1 знака */
echo round1.551PHP_ROUND_HALF_UP);   //  1.6
echo round1.541PHP_ROUND_HALF_UP);   //  1.5
echo round(-1.551PHP_ROUND_HALF_UP);   // -1.6
echo round(-1.541PHP_ROUND_HALF_UP);   // -1.5

/* Использование PHP_ROUND_HALF_DOWN с точностью до 1 знака */
echo round1.551PHP_ROUND_HALF_DOWN); //  1.5
echo round1.541PHP_ROUND_HALF_DOWN); //  1.5
echo round(-1.551PHP_ROUND_HALF_DOWN); // -1.5
echo round(-1.541PHP_ROUND_HALF_DOWN); // -1.5

/* Использование PHP_ROUND_HALF_EVEN с точностью до 1 знака */
echo round1.551PHP_ROUND_HALF_EVEN); //  1.6
echo round1.541PHP_ROUND_HALF_EVEN); //  1.5
echo round(-1.551PHP_ROUND_HALF_EVEN); // -1.6
echo round(-1.541PHP_ROUND_HALF_EVEN); // -1.5

/* Использование PHP_ROUND_HALF_ODD с точностью до 1 знака */
echo round1.551PHP_ROUND_HALF_ODD);  //  1.5
echo round1.541PHP_ROUND_HALF_ODD);  //  1.5
echo round(-1.551PHP_ROUND_HALF_ODD);  // -1.5
echo round(-1.541PHP_ROUND_HALF_ODD);  // -1.5
?>

Список изменений

Версия Описание
5.3.0 Был добавлен параметр mode.
5.2.7 Работа функции round() была изменена в соответствии со стандартом C99.

Смотрите также

  • ceil() - Округляет дробь в большую сторону
  • floor() - Округляет дробь в меньшую сторону
  • number_format() - Форматирует число с разделением групп

Коментарии

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 .
2000-05-15 21:51:00
http://php5.kiev.ua/manual/ru/function.round.html
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(12417573); // 1240000
?>

Works on negative numbers too. $sigdigs should be >= 0

<?php
function RoundSigDigs($number$sigdigs) {
   
$multiplier 1;
    while (
$number 0.1) {
       
$number *= 10;
       
$multiplier /= 10;
    }
    while (
$number >= 1) {
       
$number /= 10;
       
$multiplier *= 10;
    }
    return 
round($number$sigdigs) * $multiplier;
}
?>
2002-08-14 17:15:13
http://php5.kiev.ua/manual/ru/function.round.html
To round any number to a given number of significant digits, use log10 to find out its magnitude:

<?php round($nceil(log10($n)) + $sigdigits); ?>

Or when you have to display a per-unit price which may work out to be less than a few cents/pence/yen you can use:

<?php
// $exp = currency decimal places - 0 for Yen/Won, 2 for most others
$dp ceil(log10($n)) + $sigdigits;
$display number_format($amount, ($exp>$dp)?$exp:$dp);
?>

This always displays at least the number of decimal places required by the currency, but more if displaying the unit price with precision requires it - eg: 'English proofreading from $0.0068 per word', 'English beer from $6.80 per pint'.
2004-01-12 13:45:24
http://php5.kiev.ua/manual/ru/function.round.html
the result of this function always depends on the underlying C function. There have been a lot of compiler bugs and floating-point precission problems involving this function. Right now the following code:

<?php
echo round(141.0752);
?>

returns:

141.07

on my machine.
So never really trust this function when you do critical calculations like accounting stuff!
Instead: use only integers or use string comparisons.
2006-10-16 08:15:04
http://php5.kiev.ua/manual/ru/function.round.html
Please note that the format of this functions output also depends on your locale settings. For example, if you have set your locale to some country that uses commas to separate decimal places, the output of this function also uses commas instead of dots.

This might be a problem when you are feeding the rounded float number into a database, which requires you to separate decimal places with dots.

See it in action:
<?php
   
echo round('3.5558'2);
   
setlocale(constant('LC_ALL'), 'et_EE.UTF-8');
    echo 
'<br />'round('3.5558'2);
?>

The output will be:
3.56
3,56
2008-01-12 17:40:18
http://php5.kiev.ua/manual/ru/function.round.html
This function will let you round to an arbitrary non-zero number.  Zero of course causes a division by zero.

<?php
function roundTo($number$to){
    return 
round($number/$to0)* $to;
}

echo 
roundTo(87.2320); //80
echo roundTo(-87.2320); //-80
echo roundTo(87.23.25); //87.25
echo roundTo(.23.25); //.25
?>
2009-09-25 09:42:12
http://php5.kiev.ua/manual/ru/function.round.html
Автор:
This functions return ceil($nb) if the double or float value is bigger than "$nb.5" else it's return floor($nb)

<?php
   
function arounds_int($nb) {
     
        if(!
is_numeric($nb)) {
            return 
false;
        }
       
       
$sup round($nb);
       
$inf floor($nb);
       
$try = (double) $inf '.5' 
       
        if(
$nb $try) {
            return 
$sup;
        }
       
        return 
$inf;
    }
?>
2009-11-02 10:52:35
http://php5.kiev.ua/manual/ru/function.round.html
Here is a short neat function to round minutes (hour) ...

<?php

function minutes_round ($hour '14:03:32'$minutes '5'$format "H:i")
{
   
// by Femi Hasani [www.vision.to]
   
$seconds strtotime($hour);
   
$rounded round($seconds / ($minutes 60)) * ($minutes 60);
    return 
date($format$rounded);
}

?>

You decide to round to nearest minute ...
example will produce : 14:05
2010-08-27 10:59:45
http://php5.kiev.ua/manual/ru/function.round.html
Автор:
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 
function roundUpTo($number$increments) {
   
$increments $increments;
    return (
ceil($number $increments) / $increments);
}
?>
2010-10-07 19:07:58
http://php5.kiev.ua/manual/ru/function.round.html
Beware strange behaviour if number is negative and precision is bigger than the actual number of digits after comma.

round(-0.07, 4);

returns

-0.07000000000000001

So if you validate it against a regular expression requiring the maximum amount of digits after comma, you'll get into trouble.
2010-11-19 04:26:22
http://php5.kiev.ua/manual/ru/function.round.html
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;
echo 
round($a2); // 0.75

setlocale(LC_ALL'it_IT@euro''it_IT''it');
$b=3/4;
echo 
round($b,2); // 0,75
?>
2011-09-15 04:24:11
http://php5.kiev.ua/manual/ru/function.round.html
Автор:
round() will sometimes return E notation when rounding a float when the amount is small enough - see  https://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));
2012-07-12 14:16:41
http://php5.kiev.ua/manual/ru/function.round.html
function mround($val, $f=2, $d=6){
    return sprintf("%".$d.".".$f."f", $val);
}

echo mround(34.89999);  //34.90
2013-12-17 15:34:47
http://php5.kiev.ua/manual/ru/function.round.html
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.
2014-01-13 13:28:19
http://php5.kiev.ua/manual/ru/function.round.html
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
function round_up($number$precision 2)
{
   
$fig = (int) str_pad('1'$precision'0');
    return (
ceil($number $fig) / $fig);
}

function 
round_down($number$precision 2)
{
   
$fig = (int) str_pad('1'$precision'0');
    return (
floor($number $fig) / $fig);
}
?>
2014-03-07 17:00:21
http://php5.kiev.ua/manual/ru/function.round.html
In case someone will need a "graceful" rounding (that changes it's precision to get a non 0 value) here's a simple function:

function gracefulRound($val, $min = 2, $max = 4) {
    $result = round($val, $min);
    if ($result == 0 && $min < $max) {
        return gracefulRound($val, ++$min, $max);
    } else {
        return $result;
    }
}

Usage:
$_ = array(0.5, 0.023, 0.008, 0.0007, 0.000079, 0.0000048);
foreach ($_ as $val) {
    echo "{$val}: ".gracefulRound($val)."\n";
}

Output:
0.5: 0.5
0.023: 0.02
0.008: 0.01
0.0007: 0.001
0.000079: 0.0001
0.0000048: 0
2014-03-19 16:22:56
http://php5.kiev.ua/manual/ru/function.round.html
Unexpected result or misunderstanding (php v5.5.9)

<?php

echo round(1.551PHP_ROUND_HALF_DOWN); // 1.5
echo round(1.5511PHP_ROUND_HALF_DOWN); //1.6

?>
2014-07-02 01:49:37
http://php5.kiev.ua/manual/ru/function.round.html
Excel-like ROUNDUP function:

public static function round_up($value, $places) 
{
    $mult = pow(10, abs($places)); 
     return $places < 0 ?
    ceil($value / $mult) * $mult :
        ceil($value * $mult) / $mult;
}

echo round_up(12345.23, 1); // 12345.3
echo round_up(12345.23, 0); // 12346 
echo round_up(12345.23, -1); // 12350 
echo round_up(12345.23, -2); // 12400 
echo round_up(12345.23, -3); // 13000 
echo round_up(12345.23, -4); // 20000
2014-08-24 09:31:29
http://php5.kiev.ua/manual/ru/function.round.html
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)
2014-09-02 06:34:49
http://php5.kiev.ua/manual/ru/function.round.html
Because this function is missing round up and round down constants and the top note doesn't really show you how to round up or down to the nearest number, here is an easy way to always round up or always round down to the nearest number.

int is the number you want to round

n is the nearest number you want rounded to.

Round up to the nearest number

function round_up($int, $n) {
    return ceil($int / $n) * $n;
}

And to round down to the nearest number

function round_down(int, $n) {
    return floor($int / $n) * $n;
}
2015-08-03 22:30:02
http://php5.kiev.ua/manual/ru/function.round.html
PHP 5.3, 5.4, 5.5
<?php
$fInfinty 
pow(10001000); // float(INF)
$fResult round(123.456$fInfinty); // double(123)
?>

PHP 5.6
<?php
$fInfinty 
pow(10001000); // float(INF)
$fResult round(123.456$fInfinty); // float(0)
?>

PHP 7
<?php
$fInfinty 
pow(10001000); // float(INF)
$fResult round(123.456$fInfinty); // null
?>
2016-05-12 09:25:29
http://php5.kiev.ua/manual/ru/function.round.html
Автор:
Note that PHP 5.3 didn't just introduce $mode, it rewrote the rounding implementation completely to eliminate many kinds of rounding errors common to rounding floating point values.

That's why round() gives you the correct result even when floor/ceil don't.
For example,  floor(0.285 * 100 + 0.5) VS round(0.285*100 + 0.5). First one gives 28, second one gives 29.

More details here: https://wiki.php.net/rfc/rounding
2016-11-18 01:33:01
http://php5.kiev.ua/manual/ru/function.round.html
/**
 * 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
 * 
 */
2016-11-28 23:25:25
http://php5.kiev.ua/manual/ru/function.round.html
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
 */
function truncate($val$f="0")
{
    if((
$p strpos($val'.')) !== false) {
       
$val floatval(substr($val0$p $f));
    }
    return 
$val;
}
?>

Originally posted in http://stackoverflow.com/a/12710283/1596489
2017-01-13 19:51:17
http://php5.kiev.ua/manual/ru/function.round.html
Автор:
This function has strange. behaviors:

<?php
echo round(0.0452);      // 0.05
echo round(0.451);      // 0.5
echo round(1.045-12);    // 0.04 !!!
echo round(1.45-11);      // 0.5
2017-08-31 17:23:17
http://php5.kiev.ua/manual/ru/function.round.html
Автор:
Solving round_down() problem: 
-----------------------------
Use of <?php floor(pow(10$precision) * $value) / pow(10$precision); ?> fails in some cases, e.g. round_down(2.05, 2) gives incorrect 2.04.
Here is a "string" solution (https://stackoverflow.com/a/26491492/1245149) of the problem (a negative precision is not covered):

<?php
function round_down($value$precision) {       
   
$value = (float)$value;
   
$precision = (int)$precision;
    if (
$precision 0) { 
       
$precision 0;
    }
   
$decPointPosition strpos($value'.');
    if (
$decPointPosition === false) { 
        return 
$value;
    }
    return (float)(
substr($value0$decPointPosition $precision 1));       

?>

Solving round_up() problem:
---------------------------
Use of <?php ceil(pow(10$precision) * $value) / pow(10$precision);?> fails in some cases, e.g. round_up(2.22, 2) gives incorrect 2.23 (https://stackoverflow.com/a/8239620/1245149).
Adapting the above round_down() "string" solution I have got this result (a negative precision is not covered):

<?php
function round_up($value$precision) {       
   
$value = (float)$value;
   
$precision = (int)$precision;
    if (
$precision 0) { 
       
$precision 0;
    }
   
$decPointPosition strpos($value'.');
    if (
$decPointPosition === false) { 
        return 
$value;
    }
   
$floorValue = (float)(substr($value0$decPointPosition $precision 1));
   
$followingDecimals = (int)substr($value$decPointPosition $precision 1);
    if (
$followingDecimals) {
       
$ceilValue $floorValue pow(10, -$precision); // does this give always right result?
   
}
    else {
       
$ceilValue $floorValue;
    }
    return 
$ceilValue;               
}
?>

I don't know it is bulletproof, but at least it removes the above mentioned fail. I have done no binary-to-decimal-math-analysis but if `$floorValue + pow(10, 0 - $precision)` works
always as expected then it should be ok.
2018-01-26 09:28:35
http://php5.kiev.ua/manual/ru/function.round.html
When you have a deal with money like dollars, you need to display it under this condition:
-format all number with two digit decimal for cents.
-divide 1000 by ,
-round half down for number with more than two decimal

I approach it using round function inside the number_format function:

number_format((float)round( 625.371 ,2, PHP_ROUND_HALF_DOWN),2,'.',',')  // 625.37
number_format((float)round( 625.379 ,2, PHP_ROUND_HALF_DOWN),2,'.',',')  // 625.38
number_format((float)round( 1211.20 ,2, PHP_ROUND_HALF_DOWN),2,'.',',')  // 1,211.20
number_format((float)round( 625 ,2, PHP_ROUND_HALF_DOWN),2,'.',',')      // 625.00
2018-07-11 00:34:26
http://php5.kiev.ua/manual/ru/function.round.html
Автор:
It should just be noted that what is called "precision" on this page is more correctly called accuracy; precision is the total number of significant digits on both sides of the decimal point, while accuracy is the number of digits to the right of the point. It's a common confusion.
2019-09-05 03:17:48
http://php5.kiev.ua/manual/ru/function.round.html
Автор:
Okay, final version of my function:

function NumberPrecision($n, $precision=0, $is_round=true)
            {
            if ($is_round)
                {
                $r = 5 * pow(10, -($precision+1));
                $n += (($n < 0) ? -$r : $r);
                }
           
            $comma = '.';
           
            $r = 5 * pow(10, -($precision+2));
            $n += (($n > 0) ? -$r : $r);
            $n = number_format($n, $precision+1, $comma, '');
           
            $n .= $comma;
            list($n, $frac) = explode($comma, $n, 2);
            $n = rtrim(rtrim($n, $comma) . $comma . substr($frac, 0, $precision), $comma);
            return ($n);
            }

It can be useful in come cases when built-in function like round() or number_format() returns unexpected results. Works with positive and negative numbers, zero, numbers like 1/12, 0.3, numbers in scientific notation etc.
2020-02-27 22:32:39
http://php5.kiev.ua/manual/ru/function.round.html

    Поддержать сайт на родительском проекте КГБ