php中的整数和浮点数

简介

整数称为integer,浮点数称为float(也称作double,实际上两者相同,并无单双精度之分)。

php中的整数都是有符号的,取值范围取决于计算机系统的字长。字面值可以用10进制、2进制(前缀0b)、8进制(前缀0)和16进制(前缀0x)表示。

当使用超过范围的整数时,php会自动将类型转换为浮点数。所以有时候给一个变量赋一个整数值,结果变量的类型却成了浮点数,而且数值也不是所赋的那个整数值。

浮点数的取值范围也取决于计算机系统的字长,可以使用小数点或科学计数法进行表示。


数值相关的预定义常数

PHP_INT_SIZE : integer的字长(单位为字节)

PHP_INT_MAX  : integer的最大值

PHP_INT_MIN  : integer的最小值

INF          : 正无穷大

NAN          : 非数值


var_dump(PHP_INT_SIZE);
var_dump(PHP_INT_MAX);
var_dump(PHP_INT_MIN);
--------------------
int(8)
int(9223372036854775807)
int(-9223372036854775808)


浮点数的精度

由于浮点数的精度问题,浮点数之间不应该直接进行相等比较,相反,可以采用比较差值是否足够小来判断两个值是否相等:

$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
if(abs($a-$b) < $epsilon) {
    echo "true";
}

INF和NAN

某些数学运算会产生一个由常量 NAN 所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值(除了 TRUE)进行的松散(==)或严格(===)比较的结果都是 FALSE。注意,NAN转换布尔值时为true。
由于 NAN 代表着任何不同值,不应拿 NAN 去和其它值进行比较,包括其自身,应该用 is_nan() 来检查。

INF表示无穷大,比如1/0就会得到一个无穷大,is_infinite()可用来检查变量是否为无穷大值(包括正负无穷大)。相反,is_finite()用来检查一个值是否为有限值。

$a = 1/0;
$b = 0/0;
var_dump($a);
var_dump($b);
var_dump($b == $b);
var_dump($b == true);
var_dump($b == false);
var_dump(is_nan($b));

--------------------

float(INF)
float(NAN)
bool(false)
bool(true)
bool(false)
bool(true)


$a = NAN == NAN;
$b = NAN === NAN;
var_dump($a);   // bool(false)
var_dump($b);   // bool(false)

$a = 1/0;
$b = PHP_INT_MAX ** 2;
$c = 2;
echo is_infinite($a)?"true":"false"; // true
echo is_infinite($b)?"true":"false"; // false
echo is_infinite($c)?"true":"false"; // false

运算符

数值类型支持以下这些算术运算符(及相应的复合赋值运算符):

-(一元)、+(一元)、+、-、*、/、%、**、++(前后自增)、--(前后自减)


其中**运算符为方次运算:

$num = 2 ** 3;
echo $num; // 8


注意:

1.除法运算符总是返回浮点数。只有在下列情况例外:两个操作数都是整数(或字符串转换成的整数)并且正好能整除,这时它返回一个整数。
2.取模运算符的操作数在运算之前都会转换成整数(除去小数部分)。
3.取模运算符 % 的结果和被除数的符号(正负号)相同。即 $a % $b 的结果和 $a 的符号相同。

var_dump(6.6 / 3.3);  // float(2)
var_dump(6.0 / 3);    // float(2)
var_dump(6 / 3);      // int(2)

var_dump(7.2 % 3.6);  // int(1)

整数类型支持以下这些位运算符(及相应的复合赋值运算符):

~、&、|、^、<<、>>


其中>>为有符号右移:

$num = -16;
echo $num << 2; // -64;
echo $num >> 2; // -4;


  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值