和其他语言一样,PHP中的数字是用二进制系统(1和0的系统)表示的,所以一些数学运算可能会产生与我们预期略有不同的结果。本页对不同情况下的计算行为进行了概述。为了理解,至少需要有**数理技术和**数理系统的基本知识。
数字的表示方式由数据类型决定,例如,整数是直接从源代码中从十进制转换为二进制。我们完全不必担心数字的转换,一切都会自动完成。
这种转换的后果是,整数的最大值是由内存中可用的比特数决定的。在32位的PHP中,范围是从-2,147,483,648
到-2,147,483,647
(~±20亿),64位PHP的范围是从-9,223,372,036,854,775,808
到-9,223,372,036,854,775,807
(~±9万亿)。最大值总是可以通过调用常数PHP_INT_MAX
来获得。
十进制数存储在float数据类型中,它的精度有限,所以它在内部被存储为一对数字,这些数字要经过数学运算尾数*(2^指数)
。实际的结果是,我们能够在少量的比特中存储一个相对较大的数字(大约几十亿),只是不是非常精确。
使用float数据类型的后果是,计算 "1-0.9 "的结果不完全是 "0.1"。
例子来自网络论坛。
$x = 0.3;$y = 0.4;echo 0.7 - $x - $y; //打印出-5.5511151231258E-17
如果我们稍微调整一下数字。
$x = 6.5;$y = 7.5;echo 14.0 - $x - $y; //打印出0
一般来说,这个问题在VTM.e15.cz的单独文章中讨论:为什么计算机对小数有问题,或者在一般情况下关于浮动点的维基百科。
一般来说,在计算后将结果四舍五入是个好主意,或者完全避免小数。例如,不以克朗(如14.90)而是以便士(如1490)存储价格,然后准确地进行操作。本文的下一节将讨论四舍五入。
$a = 5;$b = 3;echo $a + $b;
常见的数学惯例可用于运算,根据数学规则尊重运算符的优先权(乘法优先于加法,等等)。值可以直接写入或通过变量读取。
乍一看可能不明显,但在数学的例子中,等号(
=
)没有写。因此,只有简单的 "二元运算 "可以解决,它总是只对 "两个元素 "起作用(不要计算方程,你必须使用专门的库来解决)。
在 "结果 "栏中,我列出了假设打印的内容。
$a = 5;$b = 3;$c = 10;
操作 | 标记 | 标记字样 | 符号实例 | 结果 |
---|---|---|---|---|
加法 | + |
加法 | echo $a + $b; |
8 |
减法 | - |
减法 | echo $a - $b; |
2 |
乘法 | * |
星号 | echo $a * $b; |
15 |
除法 | / 斜线 |
echo $a / $b; |
1.66666666667 | |
括号内|()|括号内|echo $a +($b * $c);` | 35 | |||
字符串连接 | . |
周期 | echo $a . $b . $c; |
5310 |
除法后的剩余部分 | % |
百分比 | echo $a % $b; |
2 |
添加一个 | ++ |
两个加号 | echo $a++; |
6 |
减去一个 | -- |
两个减法 | echo $a--; |
4 |
权力 | *** |
两个星号 | echo $a ** $b; |
125 |
幂运算符(双星号)仅在 PHP 7.1 起可用,在其他版本的 PHP 中必须使用通用函数
pow($a, $b)
。
如果你要解决一些常见的计算任务,很可能在PHP中已经有了直接的函数,这里是对它们的注释性概述。
正常的四舍五入是通过round()函数完成的,它有三个参数。
round(5); // 5round(5.1); // 5round(5.4); // 5round(5.5); // 6round(5.8); // 6round(5483.47621, 2); // 5483.47round(5483.47621, -2); // 5500
还有一个floor()函数用于向下取整,一个ceil()函数用于向上取整。
注意数据类型!。
所有的四舍五入函数都将结果返回为
float
,即使结果是一个整数。如果你想把结果当作一个整数,那么事后重写结果就很重要。例如:
echo (int) round(3.14);
PHP处理不同的数据类型,例如对于float,很容易发生round()
的结果不是一个具有有限小数扩展的数字。对于列表,我建议使用number_format()
函数,我在下面讨论。
这些都是用于很多不同的计算,并以单位圆为基础。例如,它们被用于绘制圆、椭圆、位移等。
计算x
和y
的角度。直角坐标和极坐标的转换。
以单位双曲线为基础。它们的定义可以通过使用比喻轻松描述。
例如,它们被用于地形生成和物理模拟。
以单位双曲线为基础。
echo sin(30); // -0.98803162409286echo sin(deg2rad(30)); // 0.5echo cos(deg2rad(123)); // -0.54463903501503echo 1/tan(deg2rad(45)); // 1 (onen cotangent)echo sin(deg2rad(500)); // 0.64278760968654echo atan2(deg2rad(50), deg2rad(23)); // 1.1396575860761
有时,我们可能需要将一个数学表达式作为一个用户字符串来处理,例如5+2^(1+3/2)
。
在PHP中没有简单的方法来处理这样的输入,但我已经编程了一系列的库来解决这个问题。
详情请见单独的文章PHP中的计算器:将数学表达式处理为字符串。
大数和小数在PHP中是以浮点数的形式存储的,另外它们会被四舍五入到小数点后15位左右,这有时会让人很烦。这就是为什么**BCMath任意精度数学库被创建**。
在这个库中,数字被表示为字符串,所以它们不受**浮点的不精确性的限制,但所进行的操作要慢几个数量级(但仍比我们自己编程的这种函数快)。
例如,如果我们想得到小数点后2至3位的平方根,我们只要调用。
echo bcsqrt('2', 3); // 1.414
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | zh