—– 最后更新【2018-12-7】—–
一、语法
1、简介
在PHP中,数字被分为两种类型:整数、浮点数。
2、类型的转换
1)转换为整形
方法一:使用(int)
或(integer)
转换成整形
方法二:使用intval($var)
把 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)
把 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
参考:
官方文档:
- Integer 整型 – http://php.net/manual/zh/language.types.integer.php
- Float 浮点型 – http://php.net/manual/zh/language.types.float.php
- Math 函数 – http://php.net/manual/zh/ref.math.php
相关书籍:
- 《PHP经典实例》 David Sklar & Adam Trachtenberg