第四章:第5节 PHP数据类型-浮点型

更新于:2020-12-03 20:46:44

浮点型就是带小数点的数字


有两种写法:


$v1 = 1.234; //带小数点,,就是浮点类型

$v2 = 1.234E3;//科学计数法,含义是:1.234乘以103次方,即1234,带E的形式就是浮点数

$v3 = 1234E3//结果值是1234000,但也是一个浮点数。


关于浮点数的细节知识

十进制小数转二进制小数的做法:乘2并顺序取整数部分。没有系统函数。

1.png

1.png


浮点数不应直接进行大小比较


因为浮点数在系统内部(cpu级别),很可能都是不精确表达。尤其浮点数是通过算术运算获得的。

要想进行比较,我们只能考虑自己应用中的精度要求的基础上,将其转换为整数进行比较。


通常的做法是:乘以10的精度位数数次方,比如精度要求3位有效数字,则乘以10的3次方

1.png


1.png

当整数运算的结果超出整数的范围后,会自动转换为浮点数。


备注:


上面if()是我们后面要学的一个PHP逻辑语句,只要符合括号里的条件,大括号里的代码就可以执行。


round()是一个函数,功能把一个数四舍五入,返回值是浮点型,在手册里有详细介绍。


提示:round是个不错的函数。浮点数之间做比较时,尤其涉及到运算,强烈建议用round函数处理下。


var_dump( 880 == '880' ); //true
var_dump( (float)880 == '880' ); //true
var_dump( 8.8 * 100 == '880' ); //false
var_dump( 8.8 * 100 == 880 ); //false
var_dump( round(8.8 * 100) == '880' ); //true

var_dump( 710 == '710' ); //true
var_dump( (float)710 == '710' ); //true
var_dump( 7.1 * 100 == '710' ); //true
var_dump( 7.1 * 100 == 710 ); //true
var_dump( round(7.1 * 100) == '710' ); //true

看这两组数,

我们用眼一看就知道 8.8*100结果是880,应该等于880的,可PHP做比较运算后反而返回false。

可7.1*100结果是710,应该等于710的,PHP比较运算后也是返回true

不借助round函数处理下,是很难发现这样的细微差异。这些细节不注意,很容易造成程序的bug出现。


拓展知识:


如果安装的PHP是32位的,整数的最大上限是2147483647,最小上限-2147483647;64位的上限是9223372036854775807。


如果一个整数在php定义或者计算赋值后超出了当前环境int型的最大值,php的做法是将这个整数转换为float型,因为这样可以以科学计数法进行存储。而这一过程,会带来精度的损失。


$num=101000000411132513120104;


echo $num;

得到

1.0100000041113E+23


也就是说,$num在赋值后已经不完全是原来的数字了,所以没法原样进行输出。


如果要原样进行输出,要在赋值之前就把值转换成string型,并以此来存储,这样才能保证原样输出。当然,这样做之后也没法再进行运算了,因为一旦运算,又会回归到浮点数存储。


一般而言,64位比32位具有更高的运行效率,在其他软硬件许可的情况下,尽量使用64位版的PHP。


通过phpinfo(); 可查看当前的PHP版本和位数


800.jpg


查看线程安全:


800.jpg


有关PHP的线程安全选择再介绍下:


由于不同的服务器使用不同的技术实现来并行处理接收到的HTTP请求。比如,有些服务器使用多线程技术,有些使用多进程技术,有些使用多线程和多进程的混合技术。


PHP采用非线程安全版本还是线程安全版本,主要取决于与其集成的服务器所采用的运行机制。如果服务器本身就已经做好了所有的线程安全工作,那么就不需要PHP来重复浪费"体力";如果服务器本身无法避免线程安全问题,那么就应该让PHP来完成这部分工作。


就一般情况而言,如果PHP与Apache进行集成,并且是以Apache模块的方式运行,则应该选择Thread Safe版本。


如果PHP与IIS进行集成,由于IIS一般采用Fast CGI的方式来运行PHP,则应该选择Non-Thread Safe版本。


在Linux下,PHP不需要线程安全。现在的Apache也是不再以mod_php模块形式载进Apache,而是以mod_fcgid模块(fastcgi)启动php-cgi程序。php-cgi是单进程,会预留两个,在PHP请求多的情况下,不够用的情况下,httpd会临时增多。

 

本节学习代码》》》