如何在PHP中处理数字
作者选择 Open Sourcing Mental Illness Ltd 作为 Write for DOnations 计划的一部分接受捐赠。
介绍
数字在编程中非常常见。 它们用于表示诸如屏幕尺寸尺寸、地理位置、金钱、积分、视频中经过的时间量、游戏头像的位置以及通过分配数字代码的颜色之类的东西。
能够在编程中有效地执行数学运算是一项需要培养的重要技能,因为您使用数字的频率很高。 尽管对数学的高层次理解当然可以帮助您成为更好的程序员,但这不是先决条件。 如果您没有数学背景,请尝试将数学视为完成您想要实现的目标的工具,以及提高逻辑思维的一种方式。
我们将使用 PHP 中的两种数值数据类型,integers 和 floats:
- 整数是可以是正数、负数或 0 的整数(...、
-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 的算术运算符在计算机程序中的工作方式与在计算器甚至笔和纸上的工作方式相同。 需要注意的重要方面是用于操作的符号。 让我们看一下最常见的算术运算符。
Addition (+
):从第一个值开始,然后将下一个值添加到该数字。 这可以使用数值本身或包含该值的变量来执行:
$start=10; var_dump($start+3);
结果是这个方程的 sum:
Outputint(13)
减法 (-
):从第一个值开始,从前一个值中减去或删除下一个值:
$start=10; var_dump($start-3);
结果是这个方程的 差 :
Outputint(7)
Multiplication (*
):从第一个值开始,乘以下一个值:
$start=10; var_dump($start*3);
这与将第一个数字与第二个数字相加的次数相同:
$start=10; var_dump($start+$start+$start);
两者都给我们相同的结果,方程的 product:
Outputint(30)
Division(/
):第二个值可以进入第一个值多少次:
$start=10; var_dump($start/3);
结果是这个等式的 商:
Outputfloat(3.3333333333333)
在这种情况下,结果以浮点数而不是整数形式给出,因为 3 不会均匀地进入 10。 我们可以告诉 PHP 通过添加 (int)
将结果作为整数值给我们,这将忽略 .
之后的任何内容:
$start=10; var_dump((int) $start/3);
将结果作为整数给出,它是一个整数:
Outputint(3)
当需要除法方程的剩余值或余数时,称为 模 (%
):
$start=10; var_dump($start%3); var_dump(3%$start);
第一个 var_dump
给出了前面除法方程的余数。 当等式反转时,模返回 3
因为 10 进入 3 个零次,留下原始 3 作为余数:
Outputint(1) int(3)
在创建基于奇数行或偶数行的模式时,通常使用模数。 当判断某一行的整数计数是奇数还是偶数时,使用 %2
:
var_dump(10%2); var_dump(11%2);
偶数的结果总是 0,因为偶数可以被 2 整除,而奇数的结果总是 1,因为它不能被整除:
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
的东西,这样我们就可以将整数 9
分配给 $basket
。 到目前为止,该程序看起来像这样:
$basket = 10; $basket += 5; $basket -= 6; echo $basket;
当 $basket
在最后一行回显时,它给出最终值:
Output9
虽然 Sammy 一次可以吃很多苹果,但我一次只能吃一个苹果。
增量运算符
为了将数字增加 1
,PHP 提供了一个单独的增量运算符,它是一个双加号 (++
)。 这可用于独立(在其自己的行上)或直接在表达式中递增变量。 让我们回到苹果篮示例,其中 $basket
变量的当前值为 9
:
++$basket; echo $basket;
第一行将当前值加 1,即 9,下一行给出结果:
Output10
我们可以在一行中做同样的事情:
echo ++$basket;
首先它将当前值加 1,即 10,下一行给出结果:
Output11
再次输出$basket
的值时:
echo $basket;
它确认 $basket
变量实际上已在上一行中更新,而不仅仅是添加到输出结果中:
Output11
在前面的每一行中,增量运算符都在变量之前使用。 在执行任何其他操作(例如 echo
命令)之前,此预增量操作将应用于变量。 使用 ++$basket
与编写 $basket += 1
相同。 增量运算符也可以在变量之后用作后增量。 当变量被独立设置时,顺序无关紧要,但是当它在表达式中使用时,顺序变得很重要。 让我们重复这些相同的行,只是这次将增量运算符放在变量之后:
$basket++; echo $basket;
第一行将当前值加 1,即 11,下一行给出结果。 这与前面示例中的预增量行完全相同:
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
当我们看一下运算符优先级如何在我们的结果中发挥重要作用时,请记住运算符的这个顺序。
运算符优先级
运算符的 precedence 指定了它将两个表达式绑定在一起的“紧密程度”。 这通常被称为“操作顺序”。 这意味着不同的运算符被赋予更大的重要性并被首先应用。 在评估数学方程时,乘法和除法总是在加法和减法之前执行。 例如:
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
的原始值执行数学表达式。 就好像我们写了 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 之间的三位数字。
返回随机数的计算实际上并不是随机的,因此在安全性和密码学方面,PHP 提供了更多的密码学安全功能。 要生成适用于洗牌或中奖号码等无偏结果的加密随机整数,请使用 random_int
函数:
var_dump(random_int(-999, 999));
使用 random_int
您必须指定包含的最小和最大数字。 rand
和 rand_int
都接受负数。
在为可以采用字节字符串的盐、密钥或初始化向量生成加密安全值时,请使用具有指定字符串长度的 random_bytes
:
var_dump(random_bytes(20));
每次你都会得到一个新的随机字节串,它看起来像:
Outputstring(20) "q8?Ud;??W?p4?C????"
PHP 还有很多内置的数学函数。 查看 php.net 文档 了解更多信息。
结论
本教程涵盖了在处理整数和浮点数值数据类型时将使用的许多运算符。 它还演示了运算符的优先级和位置如何影响结果。 这些结果让我们了解了 PHP “处理”变量类型和可能导致的问题的方式。 最后,对内置函数的简要介绍扩展了应用程序可用的数学选择。 要了解有关其他数据类型的更多信息,请查看 Understanding Data Types in PHP。