PHP强化之02 - 数字 Math

—– 最后更新【2018-12-7】—–

一、语法

1、简介

在PHP中,数字被分为两种类型:整数、浮点数。

2、类型的转换

1)转换为整形
方法一:使用(int)(integer)转换成整形
方法二:使用intval($var)《PHP强化之02 - 数字 Math》var, “integer”),第二个参数也可以设成int`。

$num = 3.14;   
$num1 = (int) $num; 
var_dump($num1); //输出int(3)   
var_dum($num); //输出int(3)  

2)转换为浮点形
方法一:使用(float)(double)(real)转换成浮点形
方法二:使用floatval($var)《PHP强化之02 - 数字 Math》var, “float”),对于旧版本中使用的double`现已停用。

$num = '3.14ab';   
$num1 = (float) $num;  //使用(integer)也一样
var_dump($num1); //输出float(3.14)     
var_dum(floatval($num)); //输出float(3.14)     

3)转换进制
base_convert — 在任意进制之间转换数字
string base_convert ( string $number , int $frombase , int $tobase )
返回一字符串,包含 number 以 tobase 进制的表示。number 本身的进制由 frombase 指定。frombase 和 tobase 都只能在 2 和 36 之间(包括 2 和 36)。高于十进制的数字用字母 a-z 表示,例如 a 表示 10,b 表示 11 以及 z 表示 35。
相关函数:
bindec — 二进制转换为十进制
decbin — 十进制转换为二进制
octdec — 八进制转换为十进制
decoct — 十进制转换为八进制
hexdec — 十六进制转换为十进制
dechex — 十进制转换为十六进制
hex2bin — 转换十六进制字符串为二进制字符串
bin2hex — 二进制字符串转换为十六进制值

二、Integer 整型

整型值可以使用十进制,十六进制,八进制或二进制(PHP 5.4.0 起可用)表示,前面可以加上可选的符号(- 或者 +)。

要使用八进制表达,数字前必须加上 0(零)。要使用十六进制表达,数字前必须加上 0x。要使用二进制表达,数字前必须加上 0b

$a = 0x11; //十六进制 
$b = 0b11; //二进制
$c = 011; //八进制

var_dump($a);
var_dump($b);
var_dump($c);

输出结果为(十进制):

int(17) int(3) int(9)

三、Float 浮点型

浮点型(也叫浮点数 float,双精度数 double 或实数 real)可以用以下任一语法定义:

$a = 1.234;
$b = 1.2e3;
$c = 7E-10;

var_dump($a);
var_dump($b);
var_dump($c);

输出结果为:

float(1.234) float(1200) float(7.0E-10)

注意:
永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118…。

$a = 0.1;
$b = 0.7
if($a +$b == 0.8) {
  //判断结果为false,不会进来这里。
}

四、常用方法

1、数字类型的判断

1)is_numeric—检测变量是否为数字或数字字符串

bool is_numeric ( mixed $var)

检测变量是否为数字或数字字符串,如果var是数字和数字字符串则返回TRUE,否则返回FALSE
注意还要考虑科学记数法和十六进制数。

$num = '22e33'; //true
$num = 0xA3;  //true
$num = '0xA3';  //false
$num = '5,112';  //false

2)用正则式判断是否是整数

preg_match("/^[0-9]*$/", $var);

该规则为纯数字判断。

3)is_int – 检测变量是否是整数

bool is_int ( mixed $var )

is_integer — is_int() 的别名
is_long — is_int() 的别名

$num = '5';  //false
$num = 5;  //true
$num = 5.0;  //false

4)is_float—检测变量是否是浮点型

bool is_float ( mixed $var )

is_double — is_float() 的别名
is_real — is_float() 的别名

$num = 5.0;  //true
$num = '5.0';  //false

2、小数与整数的舍取

1)round—对浮点数进行四舍五入

float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )

返回将val根据指定精度precision(十进制小数点后数字的数目)进行四舍五入的结果。precision也可以是负数或零(默认值)。

echo round(3.4);         // 3
echo round(3.5);         // 4
echo round(1.95583, 2);  // 1.96
echo round(1241757, -3); // 1242000

如传入第三个参数mode值为以下之一(刚好需要舍取的下一位数刚好为5的情况): PHP_ROUND_HALF_UP(向上舍取)、PHP_ROUND_HALF_DOWN(向下舍取)、PHP_ROUND_HALF_EVEN(取最近的偶数)或PHP_ROUND_HALF_ODD(取最近的奇数)

2)ceil—进一法取整

float ceil ( float $value )

返回不小于 value 的下一个整数。 ceil() 返回的类型仍然是 float,因为 float 值的范围通常比 integer 要大

echo ceil(4.3);    // 5
echo ceil(9.999);  // 10
echo ceil(-3.14);  // -3

3)floor—舍去法取整

float floor ( float $value )

返回不大于 value 的最接近的整数,将 value 的小数部分舍去取整。floor() 返回的类型仍然是 float,因为 float 值的范围通常比 integer 要大。

echo floor(4.3);   // 4
echo floor(9.999); // 9
echo floor(-3.14); // -4

4)abs—绝对值

number abs ( mixed $number )

number 的绝对值。 如果参数 number 是 float,则返回的类型也是 float,否则返回 integer(因为 float 通常比 integer 有更大的取值范围)。

$abs = abs(-4.2); // $abs = 4.2; (double/float)
$abs2 = abs(5);   // $abs2 = 5; (integer)
$abs3 = abs(-5);  // $abs3 = 5; (integer)

3、数字的自动生成

1)range — 根据范围创建数组,包含指定的元素

array range ( mixed $start , mixed $end [, number $step = 1 ] )

建立一个包含指定范围单元的数组。

range(3,7,2);

//返回结果如下:
array(3) {
  [0]=>
  int(3)
  [1]=>
  int(5)
  [2]=>
  int(7)
}

2)rand — 产生一个随机整数

int rand ( void )
int rand ( int $min , int $max )

如果没有提供可选参数 min 和 max,rand() 返回 0 到 getrandmax() 之间的伪随机整数。

3)mt_rand — 生成更好的随机数

int mt_rand ( void )
int mt_rand ( int $min , int $max )

很多老的 libc 的随机数发生器具有一些不确定和未知的特性而且很慢。PHP 的rand()函数默认使用 libc 随机数发生器。mt_rand() 函数是非正式用来替换它的。该函数用了 » Mersenne Twister中已知的特性作为随机数发生器,它可以产生随机数值的平均速度比 libc 提供的 rand() 快四倍。

如果没有提供可选参数 min 和 max,mt_rand() 返回 0 到 mt_getrandmax() 之间的伪随机数。

4、常用数学方法

1)log — 自然对数
float log ( float $arg [, float $base = M_E ] )
如果指定了可选的参数 base,log() 返回 logbase arg,否则 log() 返回参数 arg 的自然对数。
相关方法:
log10() — 以 10 为底的对数
2)exp — 计算 e 的指数
float exp ( float $arg )
返回 e 的 arg 次方值。

3)pow — 指数表达式
number pow ( number $base , number $exp )
返回 base 的 exp 次方的幂。如果可能,本函数会返回 integer。

5、格式化一个数字

1)number_format — 以千位分隔符方式格式化一个数字
string number_format ( float $number [, int $decimals = 0 ] )
string number_format ( float $number , int $decimals = 0 , string $dec_point = "." , string $thousands_sep = "," )
本函数可以接受1个、2个或者4个参数(注意:不能是3个):

  • 如果只提供第一个参数,number的小数部分会被去掉 并且每个千位分隔符都是英文小写逗号”,”
  • 如果提供两个参数,number将保留小数点后的位数到你设定的值,其余同楼上
  • 如果提供了四个参数,number 将保留decimals个长度的小数部分, 小数点被替换为dec_point,千位分隔符替换为thousands_sep

场景:默认地,number_format函数会把这个数舍入到最接近的整数。如果想你保留整个数,但又无法提前知道小数点后有多少位,这时你该怎么办?可以使用以下解决方法:

$number = 31415.93421;  //你的数
list($int,$dec) = explode('.', $number);
$formatted = number_format($number,strlen($dec)); //$formatted为:31,415.93421

参考:

官方文档:

相关书籍:

  • 《PHP经典实例》 David Sklar & Adam Trachtenberg
    原文作者:Nosee123
    原文地址: https://www.jianshu.com/p/e7782cfa3168
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞