The constants
PHP_ROUND_HALF_UP
PHP_ROUND_HALF_DOWN
PHP_ROUND_HALF_EVEN
PHP_ROUND_HALF_ODD
are constants intended to be used as the 3rd parameter in the math function round()
https://www.php.net/manual/en/function.round
下列常量作为 PHP 核心的一部分总是可用的。
常量名 | 常量值 | 描述 |
---|---|---|
M_PI | 3.14159265358979323846 | Pi |
M_E | 2.7182818284590452354 | e |
M_LOG2E | 1.4426950408889634074 | log_2 e |
M_LOG10E | 0.43429448190325182765 | log_10 e |
M_LN2 | 0.69314718055994530942 | log_e 2 |
M_LN10 | 2.30258509299404568402 | log_e 10 |
M_PI_2 | 1.57079632679489661923 | pi/2 |
M_PI_4 | 0.78539816339744830962 | pi/4 |
M_1_PI | 0.31830988618379067154 | 1/pi |
M_2_PI | 0.63661977236758134308 | 2/pi |
M_SQRTPI | 1.77245385090551602729 | sqrt(pi) [5.2.0] |
M_2_SQRTPI | 1.12837916709551257390 | 2/sqrt(pi) |
M_SQRT2 | 1.41421356237309504880 | sqrt(2) |
M_SQRT3 | 1.73205080756887729352 | sqrt(3) [5.2.0] |
M_SQRT1_2 | 0.70710678118654752440 | 1/sqrt(2) |
M_LNPI | 1.14472988584940017414 | log_e(pi) [5.2.0] |
M_EULER | 0.57721566490153286061 | Euler constant [5.2.0] |
The constants
PHP_ROUND_HALF_UP
PHP_ROUND_HALF_DOWN
PHP_ROUND_HALF_EVEN
PHP_ROUND_HALF_ODD
are constants intended to be used as the 3rd parameter in the math function round()
https://www.php.net/manual/en/function.round
Caution when using variables with the value NAN (or directly NAN, which would not be logical) if the value is converted in any form (integer, string or other non-float format)!
In that case, NAN is converted to 0. (e.g. as an index in an array, argument of a method that takes it as a non-float parameter, etc.). This bug has been reported several times, but is still present in the current version PHP 7.3.15.
Example 1:
$array = [0 => 'zero', 1 => 'one', 2 => 'two'];
$index = NAN;
echo $array[$index]; // echo 'zero' and not as axcepted throws an exception or at least a warning 'undefined offset NAN ...'
Example 2:
function f((int) $p) { return $p; }
echo f(NAN); // echo 0 because the argument (NAN) has been converted to integer (0)
It would have to be checked in both cases explicitly for is_nan():
1: if(is_nan($index)){
<throw Exception>
}else{
echo $array[$index];
};
2: function f($p){ // without converting!!!
if(is_nan($p)){
<throw Exception>
}else{
return (int)$p; // actually a correct conversion to Integer would have to be checked because the parser does not check this here.
};
}
From PHP 7.2.0, the PHP_FLOAT_* constants are provided to describe the properties of floating point numbers that can be stored; PHP_FLOAT_MAX, for example, is analogous to PHP_INT_MAX and represents the largest possible floating-point number.
Another observation on INF.
Division by zero results in INF:
<?php
var_dump(1/0); // float(INF)
?>
BUT a 'Division by zero' warning is issued.
Although INF can be used for comparison against normal numbers and as a directed number, and behaves as reciprocal of zero, it is not like limit INF tends to infinity. These operations do not work:
<?php
var_dump(INF / INF); // float(NAN)
var_dump(INF - INF); // float(NAN)
?>
However, it works with arc-tangent:
<?php
var_dump(atan(INF) / M_PI); // float(0.5)
var_dump(atan2(INF, INF) / M_PI); // float(0.25)
var_dump(atan2(1, INF) / M_PI); // float(0)
?>
I just learnt of INF today and found out that it can be used in comparisons:
echo 5000 < INF ? 'yes' : 'no'; // outputs 'yes'
echo INF < INF ? 'yes' : 'no'; // outputs 'no'
echo INF <= INF ? 'yes' : 'no'; // outputs 'yes'
echo INF == INF ? 'yes' : 'no'; // outputs 'yes'
You can also take its negative:
echo -INF < -5000 ? 'yes' : 'no'; // outputs 'yes'
Division by INF is allowed:
echo 1/INF; // outputs '0'
There are also the predefined PHP_INT_MAX and PHP_INT_SIZE constants, that describe the range of possible integer values.