PHP 数学计算19
PHP 普通数学计算、取模、递增与递减
PHP 普通数学计算
PHP 普通数学计算直接使用算术运符:
+:加法
-:减法
*:乘法
/:除法
%:取模,得到 A 除以 B 的余数
++:递增,该值加 1
--:递减,该值减 1
加减乘除计算
<?php
$x = 10;
$y = 2;
$result = $x + $y; //结果:12
$result = $x - $y; //结果:8
$result = $x * $y; //结果:20
$result = $x / $y; //结果:5
?>
其中减法运算符(-)还可以单独使用,称为取反,即取得某个数的负值:
<?php
$x = 10;
$result = -$x; //结果:-10
?>
提示
除法运算符(/)总是返回浮点数,即使两个运算数是整数(或由字符串转换成的整数)也是这样。
PHP 取模
取模即得到两个数相除的余数:
<?php
$x = 10;
$y = 3;
$resule = $x % $y; //结果:1
?>
提示
($x % $y)在 $x 为负值时取模的结果也是负值。
取模运算常用于各种循环判断中,如取出偶数记录等。
PHP 递增
递增指将某个值增加 1 并返回该值,具体又分为:
++$x:前递增,$x 的值加 1 并返回 $x
$x++:后递增,返回 $x 的值并将 $x 加 1
下面的例子可以看出它们的区别:
$x = $y = 10;
echo ++$x.'<br />';
echo $x.'<br />';
echo $y++.'<br />';
echo $y;
输出结果如下:
11
11
10
11
PHP 递减
递减与递增相反,是指将某个值减少 1 并返回该值,也分为:
--$x:前递减,$x 的值减 1 并返回 $x
$x--:后递减,返回 $x 的并将 $x 减 1
前递减与后递减的具体区别可参考上面前递增与后递增的区别。
提示
递减 NULL 值仍返回 NULL 而不是 -1,但是递增 NULL 的结果是 1。
PHP 取整函数 ceil 与 floor
PHP ceil()
ceil() 函数:进一法取整,即取得比当前数大的下一位整数。
语法:
float ceil ( float value )
提示
ceil() 返回的类型仍然是浮点型(float)而不是想象当中的整型(integer),因为 float 值的范围通常比 integer 要大。
例子:
<?php
echo ceil(4.3); // 输出:5
echo ceil(-4.3); // 输出:-4
?>
PHP floor()
floor() 函数:舍去法取整,即取得比当前数小的最大整数。
语法:
float floor ( float value )
提示
同 ceil() 一样,floor() 返回的类型仍然是浮点型(float)而不是整型(integer)。
例子:
<?php
echo floor(4.3); // 输出:4
echo floor(-4.3); // 输出:-5
?>
实际上 ceil 来自英文当中的 ceiling(天花板),而 floor 则是地板的意思。
注意
在对某些浮点计算结果进行 ceil 或 floor 时,会出现异于常识的错误,如:
<?php
echo ceil(2.1/0.7); // 输出:4
?>
在该例中,ceil 后的结果不是通常我们认为的 3 而是 4 ,出现这种情况的原因及解决办法参见:《PHP 浮点数计算比较及取整不准确的解决方法》。
PHP round 函数:对浮点数四舍五入
PHP round()
round() 函数:对浮点数进行四舍五入。
语法:
float round ( float val [, int prec] )
返回将 val 根据指定精度 prec(十进制小数点后数字的数目)进行四舍五入的结果。prec 也可以是负数或零(默认值)。
例子:
<?php
echo round(3.4); // 输出:3
echo round(3.5); // 输出:4
echo round(1.95583, 2); // 输出:1.96
echo round(11757, -3); // 输出:12000
?>
提示
PHP 默认不能正确处理类似 "12,300.2" 的字符串,要把它当数字处理时,一个简单的办法就是使用 str_replace 函数将其中的 , 符号去掉。
PHP 找出最大值 max 函数与最小值 min 函数
PHP max()
max() 函数:返回参数中数值最大的值,可以比较无限多个值。
语法:
mixed max( number arg1, number arg2 ... )
mixed max( array numbers [, array ...] )
例子:
<?php
echo max(1, 3, 5); // 输出:5
echo max(array(2, 4, 5)); // 输出:5
?>
提示
如果第一个参数是整数、字符串或浮点数,则至少需要两个参数;PHP 会将非数值的 string 当成 0,但如果这个正是最大的数值则仍然会返回一个字符串,见下面的例子:
<?php
echo max(0, 'hello'); // 输出:0
echo max('hello', 0); // 输出:hello
echo max(-1, 'hello'); // 输出:hello
?>
多个数组比较
如果参数是多个数组,则从左向右比较:
<?php
$max = max(array(2, 4, 10), array(2, 5, 7));
print_r($max); // 输出:Array ( [0] => 2 [1] => 5 [2] => 7 )
?>
上面的例子中,虽然第一个数组的值总和大于第二个数组,但 max 函数比较规则是从左至右,2==2 但 4 < 5,所以返回第二个数组。
混合比较
如果同时给出数组和非数组作为参数,则总是将数组视为最大值返回:
<?php
$max = max('hello', array(2, 5, 7), 42); // 返回:array(2, 5, 7)
?>
PHP min()
min() 函数:返回参数中数值最小的值,可以比较无限多个值。
语法:
mixed min( number arg1, number arg2 ... )
mixed min( array numbers [, array ...] )
min() 函数的比较规则与 max() 几乎一致,只是在混合比较时,因为数组视为最大值,因此不可能返回数组。
例子:
<?php
echo min(1, 3, 5); // 输出:1
echo min(array(2, 4, 5)); // 输出:2
echo min(0, 'hello'); // 输出:0
echo min('hello', 0); // 输出:hello
echo min(-1, 'hello'); // 输出:-1
$min = min(array(2, 4, 10), array(2, 5, 7)); // 返回array(2, 4, 10)
$min = min('hello', array(2, 5, 7), 42); // 输出:hello
?>
PHP abs 函数:得到数字的绝对值
PHP abs()
abs() 函数:得到参数的绝对值,如果参数是字符串则返回 0。
语法:
number abs( mixed number )
例子:
<?php
echo abs(-4.2); // 输出:4.2
echo abs(-5); // 输出:5
echo abs('hello'); // 输出:0
?>
提示
如果参数 number 是浮点型(float),则返回的类型也是浮点型,否则返回整型(integer),因为 float 通常比 integer 有更大的取值范围。
PHP number_format 函数:格式化数字
PHP number_format()
number_format() 函数:通过千位分组来格式化数字,返回格式化后的字符串。
语法:
string number_format( float number [, int decimals [, string dec_point, string thousands_sep]] )
参数说明如下: 参数 说明
number 必需,要格式化的数字 /tr>
decimals 可选,规定多少个小数位。
dec_point 可选,规定用作小数点的字符串(默认为 . )。
thousands_sep 可选,规定用作千位分隔符的字符串(默认为 , ),如果设置了该参数,那么所有其他参数都是必需的。
例子:
<?php
echo number_format(10000); // 输出:10,000
echo number_format(10000,2); // 输出:10,000.00
echo number_format(10000,2,'.',' '); // 输出:10 000.00
echo number_format(10000,2,'.',''); // 输出:10000.00
?>
提示
该函数支持一个、两个或四个参数。
PHP 浮点数计算比较及取整不准确的解决方法
浮点数计算结果比较
一则浮点数计算例子如下:
$a = 0.2+0.7;
$b = 0.9;
var_dump($a == $b);
打印出的结果是:bool(false)。也就是说在这里 0.2+0.7 的计算结果与 0.9 并不相等,这显然是有违我们的常识的。
对此问题,PHP官方手册曾又说明:显然简单的十进制分数如 0.2 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333...。
我们将上面的变量用双精度格式打印出来:
$a = 0.2+0.7;
$b = 0.9;
printf("%0.20f", $a);
echo '<br />';
printf("%0.20f", $b);
输出结果如下:
0.89999999999999991118
0.90000000000000002220
显然在这里,实际上作为浮点型数据,其精度已经损失了一部分,达不到完全精确。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。需要说明的是,这不是PHP的问题,而是计算机内部处理浮点数的问题!在 C、JAVA 等语言中也会遇到同样的问题。
所以要比较两个浮点数,需要将其控制在我们需要的精度范围内再行比较,因此使用 bcadd() 函数来对浮点数想加并进行精度转换(为字符串):
var_dump(bcadd(0.2,0.7,1) == 0.9); // 输出:bool(true)
浮点数取整
在《PHP 取整函数 ceil 与 floor》一文中,曾有例子:
<?php
echo ceil(2.1/0.7); // 输出:4
?>
经过上面对浮点数计算的探讨,知道这是浮点数计算结果不完全精确造成的:
<?php
printf("%0.20f", (2.1/0.7)); // 输出:3.00000000000000044409
?>
经过上面对浮点数计算的探讨,知道这是浮点数计算结果不完全精确造成的,因此使用 round() 函数处理一下即可:
<?php
echo ceil( round((2.1/0.7),1) );
?>
虽然 round() 函数是按照指定的精度进行四舍五入,但保留小数点后一位,对我们的取整结果是没影响的。