数字在编程中非常常见。它们用于表示屏幕尺寸尺寸、地理位置、金钱、点数、视频中经过的时间、游戏角色的位置和通过分配数字代码的颜色等内容。
能够在编程中有效地执行数学运算是一项需要开发的重要技能,因为你将经常与数字打交道。虽然对数学的深入理解肯定可以帮助你成为更好的程序员,但这不是先决条件。如果你没有数学背景,试着把数学看作是一种工具来完成你想要达到的目标,是一种提高你逻辑思维的方法。
我们将在PHP中使用两种数字数据类型,整数和浮点数:
-1
,0
,1
,…)9.0
或-2.25
)。本教程将介绍PHP中可用于数值数据类型的许多不同操作符,以及PHP如何处理“类型杂耍”和内置数学函数。
运算符是接受一个或多个值(或表达式,用编程术语来说)并产生另一个值(这样构造本身就成为一个表达式)的东西。操作符用于基本的决策,例如指示程序根据某个值执行某个操作。
最基本的操作符是赋值操作符,一个等号:=
。赋值运算符用于设置变量的值。变量就像一个盒子。许多不同的东西可以储存在一个盒子里。额外的项目可以添加到盒子。盒子里的物品可以重新排列,也可以给每个物品贴上标签。盒子也可以清空,新的东西可以添加到盒子里。这正是在代码中使用变量时发生的情况。给变量一个名字,然后给这个命名的变量赋值:
$box=3;
var_dump($box);
$box="Hello";
var_dump($box);
为了查看变量类型和值,我们使用了var_dump()
函数而不是echo
。变量$box
被赋值为一个值为3
的int。然后这个$box
变量被赋值为"Hello"
。这与清空盒子并添加新东西是一样的。现在,当调用var_dump()
函数时,我们得到了关于$box
变量值的完全不同的信息:
Outputint(3)
string(5) "Hello"
在第一次赋值之后,$box
变量包含了整数值3
。在第二次赋值之后,$box
变量包含了一个匹配“Hello”的5个字符的字符串。
为了让我们的$box
更有用,让我们看看下一种类型的操作符。
PHP的算术运算符在计算机程序中的作用与在计算器甚至纸笔上的作用相同。需要注意的重要方面是用于操作的符号。让我们看一下最常见的算术运算符。
加法(+
)即从第一个值开始,将下一个值与该值相加。这可以使用数值本身,也可以使用包含该数值的变量:
$start=10;
var_dump($start+3);
结果就是这个等式的和:
Outputint(13)
减法(-
)即从第一个值开始,从前一个值中减去或删除下一个值:
$start=10;
var_dump($start-3);
结果就是这个方程的差值:
Outputint(7)
乘法(*
)即从第一个值开始,并将其与下一个值相乘:
$start=10;
var_dump($start*3);
这与第一个数字和第二个数字相加相同:
$start=10;
var_dump($start+$start+$start);
它们都给出了相同的结果,即方程的乘积:
Outputint(30)
除法(/
)即第二个值可以与第一个值相乘多少次:
$start=10;
var_dump($start/3);
结果就是这个等式的商:
Outputfloat(3.3333333333333)
这里的结果是一个浮点数而不是整数,因为10不能整除3。我们可以告诉PHP通过添加(int)
来给我们返回整数值,它将忽略.
后面的任何值:
$start=10;
var_dump((int) $start/3);
给出一个整数形式的结果:
Outputint(3)
当需要除法方程的剩余值或余数时,称为模运算(%
):
$start=10;
var_dump($start%3);
var_dump(3%$start);
第一个var_dump
给出了前一个除法方程的剩余部分。如果等式颠倒过来,求模会返回’ 3 ',因为3除以10等于0,余数是原来的3:
Outputint(1)
int(3)
模运算通常用于创建奇数或偶数行的模式。当确定一行的整数计数是奇数还是偶数时,使用%2
:
var_dump(10%2);
var_dump(11%2);
偶数的结果总是0,因为偶数能被2整除,而奇数的结果总是1,因为它不能被2整除:
Outputint(0)
int(1)
PHP能够快速执行复杂的计算,并提供更多的工具来编写所需的计算。指数、百分比、平方根等操作都是可能的。在介绍这些数学函数之前,让我们先了解另一种运算符,它结合了赋值运算符和算术运算符。
假设有一个篮子,里面有10个苹果。为了在代码中表示这一点,我们可以写$basket = 10
。接下来,我们再摘5个苹果,把它们放进篮子。我们可以使用存储在$basket
变量中的10
的值,而不是整数10
:$basket = $basket + 5
。虽然这在技术上是正确的,但它相当冗余。我们只想在现有的篮子中再增加5个苹果。这就是算术赋值运算符的作用。我们可以写$basket += 5
,而不是重复这个变量。这和前面的表达式完全一样。
它告诉代码:
$basket
的值5
$basket
你可以对其他算术运算符使用相同的原理:
表达式 | 结果(假设$i = 10) |
---|---|
$i += 5 |
10 + 5; 结果为: $i = 15 |
$i -= 5 |
10 - 5; 结果为: $i = 5 |
$i *= 5 |
10 * 5; 结果为: $i = 50 |
$i /= 5 |
10 / 5; 结果为: $i = 2 |
如果Sammy决定吃掉篮子里的一些苹果,我们可以使用类似$basket -= 6
的表达式,这将给$basket
赋值一个整数9
。到目前为止,程序看起来像这样:
$basket = 10;
$basket += 5;
$basket -= 6;
echo $basket;
当在最后一行回显$basket
时,它给出了最终值:
Output9
Sammy一次可以吃很多苹果,而我一次只能吃一个苹果。
对于将数字加1
,PHP提供了一个单独的递增操作符,它是一个双加号(++
)。这可以用于独立地(在单独的一行中)增加变量,也可以直接在表达式中增加变量。让我们回到apple basket的例子,其中$basket
变量的当前值是9
:
++$basket;
echo $basket;
第一行将当前值9加1,下一行给出结果:
Output10
我们可以在一行代码中完成同样的事情:
echo ++$basket;
首先,它将当前值(10)加1,下一行给出结果:
Output11
当再次输出$basket
的值时:
echo $basket;
它证实了$basket
变量实际上在上一行中被更新了,而不仅仅是添加到输出结果中:
Output11
在前面的每一行中,递增操作符都在变量之前使用。此预递增操作在任何其他操作(例如echo
命令)之前应用于变量。使用++$basket
等同于编写$basket += 1
。递增操作符也可以放在变量之后,作为后递增操作符。当变量被独立设置时,顺序并不重要,但当它被用于表达式中时,顺序就变得重要了。让我们重复这些代码行,只不过这次把递增操作符放在变量后面:
$basket++;
echo $basket;
第一行将当前值11加1,下一行给出结果。这与前一个例子中递增前的代码行完全相同:
Output12
现在我们来看看增量后的差值:
echo $basket++;
echo
操作发生在值递增之前,所以第二次echo
的结果仍然显示$basket
的值递增1之前:
Output12
最后一个echo
命令确认在echo
被处理后变量实际上被递增了:
echo $basket;
显示$basket
的最终值:
Output13
除了递增操作符,PHP还允许我们使用递减操作符通过1
递减一个值。
要减少一个值1
,我们可以使用递减操作符,它是一个双减号(--
)。与自增操作符一样,这个操作符也可以加在变量的前面或后面,但位置可能会影响程序的输出:
echo --$basket; # Pre-decrement
echo $basket--; # Post-decrement
echo $basket;
第一行在执行echo
命令之前将当前值(13)中的1
删除。下一行在计算后减值运算符之前执行echo
命令,保持输出不变。同样,最后的echo
表明$basket
的值实际上在前一行中被减少了,给了我们一个减少的值:
Output12
12
11
在我们了解运算符优先级如何在结果中发挥重要作用时,请记住运算符的这种顺序。
运算符的优先级指定了它将两个表达式绑定在一起的“紧密程度”。这通常被称为“操作顺序”。这意味着不同的运算符被赋予更大的重要性,并且首先被应用。在计算数学方程时,乘法和除法总是在加减法之前进行。例如:
echo 1 + 5 * 3;
在这个表达式中,乘法(*
)运算符的优先级高于加法(+
)运算符,因此首先计算:5 * 3 = 15
。然后执行加法运算1 + 15 = 16
。这提供了16
的最终结果:
Output16
如果不遵循运算的顺序,1 + 5
会先计算,然后再进行乘法运算,得到6 * 3 = 18
。
递增和递减操作符不能应用于数字;它们与变量一起使用。然而,我们可以在一个等式中添加变量,在其中增加或减少该值。在使用这些递增或递减的变量时,方程要么在递增或递减操作之前执行,要么在之后执行:
$my_num = 8;
echo 7 + $my_num++ + 9;
echo $my_num;
echo 7 + --$my_num + 9;
echo $my_num;
在第一个echo
行中,在后递增操作符增加$my_num
的值之前,使用$my_num
的原始值执行数学表达式。就好像我们写了echo 7 + 8 + 9;
,得到的结果是24
。从第二个echo
可以看到,$my_num
现在被设置为9。第二个数学方程是在减量操作之后执行的,这意味着$my_num
的值现在被设置为8,并且数学方程本身是相同的。在数学方程执行之后,会执行后减量操作符,给出$my_num
变量的最终结果:
Output24
9
24
8
括号总是具有最高的优先级,提供了一种分组操作或强制优先级的方法。例如,给前面的等式加括号:
echo (1 + 5) * 3;
因为括号中的元素在乘法之前计算,所以结果是不同的:
Output18
总结一下数学方程的运算符优先级:
在声明或设置变量时,PHP不会定义变量类型。相反,变量的类型是由使用变量的上下文决定的。我们可以使用var_dump()
来显示变量的详细信息,包括其类型:
$my_var = 'string';
var_dump($my_var);
$my_var = 1;
var_dump($my_var);
将字符串赋值给变量时,该变量就变成了字符串。如果将一个整型值赋给同一个变量,它就会变成一个整型:
Outputstring(6) "string"
int(1)
PHP还将根据等式的计算值设置类型:
$var1 = 1.2;
$var2 = 2;
$var3 = 12;
var_dump($var1 * $var2);
var_dump($var3 * $var2);
var_dump($var1, $var2, $var3);
如果有一个操作数是浮点数,那么两个操作数都将被计算为浮点数,结果将是浮点数,如第一个var_dump
所示。否则,操作数将被解释为整数,结果也将是整数,如第二个var_dump
所示:
Outputfloat(2.4)
int(24)
float(1.2)
int(2)
int(12)
从第三个var_dump
可以看出,这不会改变操作数本身的类型;唯一的变化是计算操作数的方式和表达式本身的结果类型。
其他数据类型(如字符串和布尔值)也可以转换为数字。这可能会引起很多混乱,所以最好避免使用。尽管PHP将产生一个通知或警告,但它仍然会尽其所能将变量“调整”为可计算的类型。例如:
表达式 | 返回值 | 类型变换 |
---|---|---|
2 * false |
0 | 布尔值被转换为整数0 |
2 * true |
2 | 布尔值被转换为整数1 |
2 * 'hi' |
0 | 字符串被转换为整数0 |
2 * '1' |
2 | 字符串被转换为整数1 |
虽然PHP的松散类型可以使编写代码更快更容易,但它通常使跟踪问题更困难。注意应用程序中使用的变量类型。
函数是可以在程序中重复使用的语句块。PHP有许多内置函数,允许我们执行额外的数学计算。
当同时处理正数和负数时,你可以使用abs
函数得到数字的绝对值:
echo abs(-1.3);
这会忽略数字前的+
或-
,只返回数字本身:
Output1.3
在使用数字估计或获取浮点数的整数值时,有多种选择:
echo round(1.3);
echo round(1.5);
echo ceil(1.3);
echo floor(1.5);
round
函数将返回最接近的整数,.5
计算为更大的数。ceil
函数总是向上取整,而floor
函数总是向下取整:
Output1
2
2
1
任何圆的比值都是相同的。因此,任何圆的周长都可以通过将其直径乘以一个名为pi
(π)的特殊数字来确定:
echo pi();
echo 4 * pi();
PHP中的pi
函数返回pi
的前14位,因为pi
是一个无理数,这意味着它的十进制形式永远不会结束。这个函数可用于计算直径为4的圆的周长:
Output3.1415926535898
12.566370614359
无论是抛硬币还是掷骰子,当结果取决于概率时,随机数都是工具。PHP提供了rand
函数来返回以下不可预测的随机结果:
echo rand();
该函数将显示一个介于0和计算机上配置的getrandmax
之间的数字。当你需要更少的随机性,或者想增加最大值时,可以同时指定最小值和最大值。要返回一个随机的三位数:
var_dump(rand(100, 999));
每次调用rand
函数,它都会返回一个100到999之间的3位数。
返回随机数的计算实际上不是随机的,因此当涉及安全和密码学时,PHP提供了更加密安全的函数。要生成一个适合于无偏结果的加密随机整数,例如洗牌或抽取中奖号码,请使用random_int
函数:
var_dump(random_int(-999, 999));
使用random_int
时,必须指定最小值和最大值。rand
和rand_int
都接受负数。
当为可以接受字节字符串的salt、keys或初始化向量生成加密安全的值时,使用指定字符串长度的random_bytes
:
var_dump(random_bytes(20));
每次你都会得到一个新的随机字节字符串,看起来像这样:
Outputstring(20) "q8?Ud;??W?p4?C????"
本教程涵盖了处理整数和浮点数数据类型时将使用的许多操作符。它还演示了运算符的优先级和位置如何影响结果。这些结果让我们了解了PHP“处理”变量类型和可能导致的问题的方式。最后,对内置函数的简要介绍扩展了应用程序可用的数学选择。