Math 函数
在线手册:中文  英文

round

(PHP 4, PHP 5)

round对浮点数进行四舍五入

说明

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

返回将 val 根据指定精度 precision(十进制小数点后数字的数目)进行四舍五入的结果。precision 也可以是负数或零(默认值)。

Note: PHP 默认不能正确处理类似 "12,300.2" 的字符串。见字符串转换为数值

参数

val

要处理的值

precision

可选的十进制小数点后数字的数目。

mode

以下之一: PHP_ROUND_HALF_UPPHP_ROUND_HALF_DOWN PHP_ROUND_HALF_EVENPHP_ROUND_HALF_ODD

返回值

四舍五入后的值

范例

Example #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
?>

Example #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
?>

更新日志

版本 说明
5.3.0 引入了 mode 参数
5.2.7 round() 的内部运作修改符合 C99 的标准。

参见


Math 函数
在线手册:中文  英文

用户评论:

Anonymous (2013-03-24 01:31:42)

Note that the returned string does not always include as many decimal digits as required by the precision argument.
It is because the least significant decimal digit(s) is (are) not reported if it is (they are) 0.
So:
<?php
round
(1.105,2); // returns 1.11
?>
but:
<?php
round
(1.104,2); // returns 1.1 instead of 1.10
?>
More:
<?php
round
(1.004,2); // returns 1 (even the decimal point is not reported)
?>

dastra (2012-07-12 11:16:41)

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));

christian at deligant dot net (2011-09-15 01:24:11)

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
?>

omnibus at omnibus dot edu dot pl (2010-11-19 02:26:22)

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.

Anonymous (2010-10-07 16:07:58)

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);
}
?>

feha at vision dot to (2010-08-27 07:59:45)

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

lossantis at ig dot com dot br (2010-07-15 07:02:26)

Since the mode parameter for options like PHP_ROUND_HALF_UP is available as of PHP 5.3, here is an alternative for ceiling:

<?php echo 252 40// 6.3 ?>

If I round this:

<?php echo round(252 40); // 6 ?>

You can also use a ceil (which might be useful for pagination):

<?php echo ceil(252/40); // 7 ?>

[Edited by: googleguy@php.net for clarity]

hugues at zonereseau dot com (2010-07-01 12:45:48)

I had problem with round() function I didn't gave me the same result in windows or on a linux server :

<?php
round
(4.7252); // gave me 4.72 on linux
round(4.7252); // gave me 4.73 on windows
?>

The expected result was 4.73

Here my function to resolve my problem

<?php
function mround($number$precision=0) {
    
    
$precision = ($precision == $precision);    
    
$pow pow(10$precision);
    
    
$ceil ceil($number $pow)/$pow;
    
$floor floor($number $pow)/$pow;
    
    
$pow pow(10$precision+1);
    
    
$diffCeil     $pow*($ceil-$number);
    
$diffFloor     $pow*($number-$floor)+($number ? -1);
    
    if(
$diffCeil >= $diffFloor) return $floor;
    else return 
$ceil;
}

echo 
mround(4.7252); // Yes 4.73
?>

Anonymous (2009-11-02 08:52:35)

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;
    }
?>

michaeldnelson dot mdn at gmail dot com (2009-09-25 06:42:12)

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
?>

Bevan (2009-09-17 12:24:15)

Formats a number to the specified number of significant figures.

<?php
/**
 * Formats numbers to the specified number of significant figures.
 *
 * @author Bevan Rudge, Drupal.geek.nz
 *
 * @param number $number
 *   The number to format.
 * @param integer $sf
 *   The number of significant figures to round and format the number to.
 * @return string
 *   The rounded and formatted number.
 */
function format_number_significant_figures($number$sf) {
  
// How many decimal places do we round and format to?
  // @note May be negative.
  
$dp floor($sf log10(abs($number)));
  
// Round as a regular number.
  
$number round($number$dp);
  
// Leave the formatting to format_number(), but always format 0 to 0dp.
  
return number_format($number== $number $dp);
}
?>

mydanielsmile+phpnet at gmail dot com (2009-03-30 12:00:28)

Function to round in increments I made:
<?php
function round_to($number$increments) {
$increments $increments;
return (
round($number $increments) / $increments);
}
?>
For example:
<?php
$n 
5.3;
echo 
round_to($n0.5); // 5.5
?>

Daniel.

Chris (2008-09-01 05:05:51)

I dont think it is a bug as such but when rounding genrally you tend to only round from the digit after the precision you want.

The only way to get arround this is by rounding it twice with diffrent precisions:

<?php 
$round1 
round(8.12463); //8.125
$round2 round($round12); //8.13
echo $round2
?>

chris at chrisstockton dot org (2008-07-30 16:05:01)

In case anyone has a problem like me ever, were you are doing very large stat calculations on a array and end up with floats with way to large of precision. A good way to round them all to N length is below.

<?php
    
public function recursiveRound(array &$arr$precision)
    {
        foreach(
$arr as $key => $val) {
            if(
is_array($val)) {
                
$this->recursiveRound($arr[$key], $precision);
            } elseif(
is_float($val)) {
                
$arr[$key] = round($arr[$key], $precision);
            }
        }
        return 
$arr;
    }
?>

martinr at maarja dot net (2008-01-12 15:40:18)

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

tom at crysis-online dot com (2007-03-17 20:31:17)

I just found out then that even if you round a double (3.7) to an integer (4), it's data type remains as 'double'. So it's always good to use the settype() function when using the round() function to prevent any problems with your scripts.

maxteiber at gmail dot com (2006-10-16 05:15:04)

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.

terry at scribendi dot com (2004-01-12 11:45:24)

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'.

ianring (at) golden.net (2003-08-07 12:30:11)

The round() function may indeed work properly with half-values (eg. 1.5), but this little method will give you peace of mind. Add some "fuzz" to your function with a miniscule delta value.

<?php
$delta 
0.00001;
$x round($x+$delta);
?>

This is fine, unless $x has a value of 1.49999 ... if you worried about that, use this method instead:

<?php
if(($x-floor($x))==0.5){
   
$x+=$delta;
}
$x round($x);
?>

you can change your "optimistic" delta into a "pessimistic" delta by subtracting instead of adding.

Cheers,
Ian Ring

ralf dot schreijer at smc dot uni-muenster dot de (2003-06-18 05:39:35)

The function below regards a higher number of digits for rounding as the number of digits you want to round! At least it rounds a Value to the number of digits you want to:

<?php
function MyRound($iValue$iDigits$iPrecision){
   
$iDigits intval($iDigits);
   
$iPrecision intval($iPrecision);
   if(
$iDigits $iPrecision){ $iPrecision $iDigits; }
   for(
$i $iPrecision$i >= $iDigits$i--){
      
$iValue round($iValue$i);
   } 
// for($i = $iPrecision; $i >= $iDigits; $i--) -- END
   
return $iValue;
}
?>

tichoux at charlevoix dot net (2002-10-23 14:06:31)

for a poll, if you want to have 100% and not 99 or 99.99 % you can do that :

<?php
round
number_format( (($individual_result*100)/$total_result), 2), 1);
?>

php at silisoftware dot com (2002-08-14 14:15:13)

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;
}
?>

twan at ecreation dot nl (2000-05-15 18:51:00)

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 .

易百教程