PHP Manual
/
数学

PHP中的数学

16. 02. 2020

Obsah článku

和其他语言一样,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); // 5
round(5.1); // 5
round(5.4); // 5
round(5.5); // 6
round(5.8); // 6
round(5483.47621, 2); // 5483.47
round(5483.47621, -2); // 5500

还有一个floor()函数用于向下取整,一个ceil()函数用于向上取整。

注意数据类型!

所有的四舍五入函数都将结果返回为float,即使结果是一个整数。

如果你想把结果当作一个整数,那么事后重写结果就很重要。例如:echo (int) round(3.14);

PHP处理不同的数据类型,例如对于float,很容易发生round()的结果不是一个具有有限小数扩展的数字。对于列表,我建议使用number_format()函数,我在下面讨论。

测角函数

这些都是用于很多不同的计算,并以单位圆为基础。例如,它们被用于绘制圆、椭圆、位移等。

循环测量功能

计算xy的角度。直角坐标和极坐标的转换。

双曲函数

以单位双曲线为基础。它们的定义可以通过使用比喻轻松描述。

  • 椭圆、圆、半径为1的圆
  • 双曲线、等轴双曲线、单位双曲线

例如,它们被用于地形生成和物理模拟。

超几何函数

以单位双曲线为基础。

使用测角函数的例子

echo sin(30); // -0.98803162409286
echo sin(deg2rad(30)); // 0.5
echo cos(deg2rad(123)); // -0.54463903501503
echo 1/tan(deg2rad(45)); // 1 (onen cotangent)
echo sin(deg2rad(500)); // 0.64278760968654
echo 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:

Související články

1.
2.
Status:
All systems normal.
2024