对于数学计算,最常见的运算其实就是我们使用各种运算符的运算,比如+加,-减等等。当然,PHP也为我们提供了一些运算函数,可以方便的进行其他的数学运算。这些函数属于Math扩展。该扩展默认包含在PHP源码中,无需额外安装,编译时不需要特殊参数,直接使用即可。常见的数学函数首先,让我们看一下比较常见的数学函数。var_dump(abs(-12));//int(12)var_dump(abs("-12.22"));//浮动(12.22)var_dump(ceil(2));//float(2)var_dump(ceil(2.1));//float(3)var_dump(ceil(2.9));//float(3)var_dump(ceil(-2.9));//float(-2)var_dump(floor(2));//float(2)var_dump(floor(2.1));//float(2)var_dump(floor(2.9));//float(2)var_dump(floor(-2.9));//float(-3)abs()是获取数据的绝对值。ceil()用于丢弃小数位并返回一个向上的整数。比如我们测试代码中的2.1,使用ceil()后返回3。-2.9返回2。其实返回的是一个舍去小数且不小于给定数据的整数。floor()和ceil()的功能相反,它在舍弃浮点数后返回一个小于给定数据的整数。var_dump(fmod(5.7,1.3));//float(0.5)var_dump(fmod(6,3));//float(0)var_dump(pow(2,5));//int(32)var_dump(sqrt(9));//float(3)var_dump(sqrt(10));//float(3.1622776601684)fmod()返回取模后的余数,有小数点,如果直接用%取模,只返回整数。你可以试试5.7%1.3的结果。pow()也是常用的幂函数,第二个参数是第一个参数的幂。sqrt()是一个二次根函数,9的平方根的结果是3。除了sqrt()之外,系统还为我们定义了几个平方根常量。var_dump(M_SQRT2);//sqrt(2)float(1.4142135623731)var_dump(M_SQRT3);//sqrt(3)float(1.7320508075689)var_dump(M_SQRT1_2);//1/sqrt(2)float(0.70710678)11865效果其实就是调用注释中说的sqrt()函数的效果。例如,M_SQRT2相当于2sqrt(2)的平方根的效果。var_dump(最大值(10、20、39、25));//int(39)var_dump(min(5,3,1,9,8));//int(1)var_dump(max([10,20,39,25]));//int(39)var_dump(min([5,3,1,9,8]));//int(1)max()函数用于返回最大的那个数,min()函数用于返回指定参数中最小的数。这两个函数的参数都不是定长的,也就是你想传多少参数就传多少。也可以直接接收一个数组作为参数,返回数组中最大的元素。这两个函数可以配合指定一个变量的最大值和最小值范围。比如我们的分页:max(1,min(100,$page));表示当前传递的页面只能在1-100范围内,超过100则返回100,小于1则返回1。可能第一次接触这两个功能的同学看到这里会头晕,还是仔细揣摩吧!var_dump(is_finite(M_PI));//bool(true)var_dump(is_infinite(M_PI));//bool(false)var_dump(is_finite(M_EULER));//bool(true)is_finite()和is_infinite()用于判断数据是否为无理数,is_finite()在使用时如果数据为无理数则返回true。而is_infinite()则相反,对无理数返回false,对有理数返回true。PI相关性在上面,我们看到了一个常量M_PI。它代表3.14……圆周率的值。var_dump(M_PI);//浮动(3.1415926535898)var_dump(pi());//float(3.1415926535898)可以看到,如果直接打印,M_PI只精确到小数点后13位,但是如果通过is_finite()判断,它返回的是一个无理数,即无穷大不循环小数.另外,通过pi()函数,还可以得到pi的值。此外,还有一堆与馅饼相关的常量。var_dump(M_PI_2);//pi()/2浮动(1.5707963267949)var_dump(M_PI_4);//pi()/4float(0.78539816339745)var_dump(M_1_PI);//1/pi()float(0.31830988618379)var_dump(M_2_PI);//2/pi()float(0.63661977236758)var_dump(M_SQRTPI);//sqrt(pi())float(1.7724538509055)var_dump(M_2_SQRTPI);//2/sqrt(pi)float(1.1283791670955)var_dumpM_LNPI);//log_e(pi())float(1.1447298858494)它们代表的含义在注释中也有解释。例如M_PI_2表示Pi除以2的结果。对数虽然我们对一些常用的对数很熟悉,但是一些不常用的或者计算后生成的对数却很麻烦。别着急,PHP也为我们准备了对数计算函数。var_dump(日志(32));//float(3.4657359027997)var_dump(log(32,2));//5默认情况下,log()函数是基于10的对数计算的,我们可以直接给它指定第二个参数为底数。var_dump(log10(1000));//float(3)var_dump(log1p(31));//float(3.4657359027997)var_dump(exp(12));//float(162753.791419)log10()显然是直接以10为底的对数。而log1p()返回log(1+number)的结果,即默认对数加1。exp()函数是计算e的指数,测试代码中计算e12的值。var_dump(M_E);//efloat(2.718281828459)var_dump(M_LOG2E);//log_2efloat(1.442695040889)var_dump(M_LOG10E);//log_10efloat(0.43429448190325)var_dump(M_LN2);//log_e2float(0.69314718055995)var_dump(M_LN10);//log_e10float(2.302585092994)同样,对数也有很多常数,具体解释也在评论里,大家可以自己看看。随机数随机数函数可能是数学扩展中最常用的函数。var_dump(getrandmax());//int(2147483647)getrandmax()函数用于返回随机数可以产生的最大值。结合下面的rand()函数来看这个函数的作用。var_dump(随机数());var_dump(rand(5,15));如果我们不指定rand()函数的参数,即不指定它的范围,那么rand()函数生成的值就是从0到getrandmax()范围内的任意随机数。如果我们为rand()函数指定一个范围,那么只会生成指定范围内的随机数。var_dump(mt_getrandmax());//int(2147483647)var_dump(mt_rand());var_dump(mt_rand(5,15));mt_开头的三个随机数相关的函数使用方法和普通的rand()没有区别。不过现在更推荐使用mt_rand()来生成随机数。它生成随机数的速度平均比rand()快四倍,官方文档中是这么说的,而且文档中还说mt_rand()可以非正式地用来代替rand()函数。不管怎样,既然官方文档这么说了,我们还是尽量使用mt_rand()吧。另外,现在生成随机数不需要提前准备随机数种子,也就是不需要使用srand()或mt_srand()这两个函数。在一些框架中可能会看到,这里就不演示了。三角学三角学可能是每个人的中学噩梦。其实在程序开发中,除了一些特定的领域,用到它们的机会真的不多。好像没用过,所以这里简单演示一下。var_dump(hypot(3,4));//float(5)var_dump(hypot(5,12));//float(13)首先是一个计算三角形斜边的函数hypot()。这里我们用两个最经典的勾股数来进行检验。相信这个成绩勾起大家中学时代美好的回忆。var_dump(sin(M_PI_2));//float(1)var_dump(cos(M_PI_2));//浮动(6.1232339957368E-17)var_dump(tan(M_PI_2));//float(1.6331239353195E+16)var_dump(sin(deg2rad(90)));//float(1)var_dump(asin(sin(M_PI_2)));//float(1.5707963267949)var_dump(acos(cos(M_PI_2)));//浮动(1.5707963267949)var_dump(atan(tan(M_PI_2)));//float(1.5707963267949)var_dump(sinh(sin(M_PI_2)));//浮动(1.1752011936438)var_dump(cosh(cos(M_PI_2)));//浮动(1)var_dump(tanh(tan(M_PI_2)));//浮动(1)var_dump(asinh(sin(M_PI_2)));//浮动(0.88137358701954)var_dump(acosh(cos(M_PI_2)));//浮动(NAN)var_dump(atanh(tan(M_PI_2)));//大块的float(NAN)就不用解释了,说多了会泪流满面。比较特别的是我们可以看到有一个deg2rad()方法,它是一个用来将角度转换成弧度的函数。前面有a的是三角函数对应的反函数,后面有h的是三角函数对应的双曲函数,a和h是反双曲函数。在最后两个测试代码中,我们的数据有NAN。相信很多同学在开发过程中也会有意无意的看到这种类型。NAN是一个非常特殊的类型,它代表了Not-a-Number的概念。但是它不属于任何标量类型,而且两个NAN不相等,json_encode()时也没有这个类型的NAN。相信做过金融或者统计分析相关系统的朋友一定对这个NAN有很深的了解。var_dump(atanh(tan(M_PI_2))==atanh(tan(M_PI_2)));//bool(false)var_dump(atanh(tan(M_PI_2))===atanh(tan(M_PI_2)));//bool(false)var_dump(NAN==NAN);//bool(false)var_dump(NAN===NAN);//bool(false)$v=json_encode(['test'=>NAN]);echo$v,PHP_EOL;//echojson_last_error_msg();//Inf和NaN不能是JSON编码bool(true)是一个很奇怪的数据类型,需要判断一个计算结果是否为NAN类型,只能使用is_nan()函数。var_dump(is_nan(atanh(tan(M_PI_2))));//bool(true)var_dump(is_nan(NAN));//bool(true)十六进制转换的最后一部分是十六进制转换的操作。老实说,面试的时候有人问我二进制和十进制怎么转换。事实上,我应该手动编写转换代码。但是我哥们直接写了这些基数转换的函数。面试官当时满脸黑线...var_dump(bindec("11"));//int(3)var_dump(bindec("110011"));//int(51)var_dump(hexdec("FF"));//int(255)var_dump(hexdec("A37334"));//int(10711860)var_dump(octdec('77'));//int(63)bindec()二进制转十进制,hexdec()十六进制转十进制,octdec()八进制转十进制。var_dump(decbin(51));//字符串(6)"110011"var_dump(dechex(255));//string(2)"ff"var_dump(decoct(63));//string(2)"77"改变单词的位置,把dec放在最前面,就变成了一个将十进制转换为对应基数的函数。这些都比较简单,最后还有一个可以进行任意基数转换的函数。var_dump(base_convert("A37334",16,10));//string(8)"10711860"var_dump(base_convert("A37334",16,2));//string(24)"101000110111001100110100"ofbase_convert()表示将第一个参数的内容从第二个参数的基数转换为第三个参数的基数。例如,在这个测试代码中,我们将A37334从十六进制转换为十进制和二进制。综上所述,今天的内容非常丰富。其实还有一些和数学计算相关的函数,但是不是很常用,这里就不多写了。数学是计算机的基础,也是理工科各专业的基础。你还是需要灵活掌握计算机编程语言提供的功能,尤其是在某些面试场景中。测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/9。介绍数学相关函数在PHP中的应用。PHP参考文档:https://www.php.net/manual/zh/book.math.php各媒体平台均可搜索【硬核项目经理】
