PHP 数学计算

@Ta 2012-12-06 2149点击
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() 函数是按照指定的精度进行四舍五入,但保留小数点后一位,对我们的取整结果是没影响的。 
回复列表(2|隐藏机器人聊天)
添加新回复
回复需要登录