MyException - 我的异常网
当前位置:我的异常网» PHP » php几个常见有关问题

php几个常见有关问题

www.MyException.Cn  网友分享于:2014-08-05  浏览:0次
php几个常见问题

一、php浮点数的一个常见问题

     首先我们先看一个例子:

<?php
    $f = 0.58;
    var_dump(intval($f * 100)); //为啥输出57
?>

     为什么输出的是57?这是php的bug吗?有很多人经常会问这样的问题,为了搞懂这个问题,那必须要知道浮点数的表示。

     浮点数以64位的长度(双精度)为例:会采用1位符号位(E),11指数位(Q),52位尾数(M)表示(一共64位)。

     ①符号位:最高位表示数据的正负,0表示正数,1表示负数。

     ②指数位:表示数据以2为底的冪,指数采用偏移码表示;

     ③尾数:表示数据小数后的有效数字。

     这里的关键点就在于,小数在二进制的表示,关于小数如何用二进制表示,如下:

     1、我们先讲解一下整数部分如何用二进制表示,如下图:


 就是用整数除以2查看它的余数,直到为0位置。整数部分计算非常简单,那下面查看小数部分如何计算

     2、小数部分用二进制表述计算方法如下:

     例如:5.6。整数部分5的二进制为101

     小数部分0.6,有这样一个公式:*2 如果<1就为0,基数=基数;>1 就为1,基数=基数-1。

     则:0.6*2=1.2>0  那么就是1  基数=1.2-1=0.2

           0.2*2=0.4<1   那么就是0  基数=0.4

           0.4*2=0.8<1   那么就为0  基数=0.8

           0.8*2=1.6>1   那么就为1  基数为1.6-1=0.6

           ... ...

          所以5.6可以表示为:101.1001...

     3、0.58对于二进制表示来说,是无限长的值如下:

0.58的二进制表示基本上(52位)是: 0010100011110101110000101000111101011100001010001111
0.57的二进制表示基本上(52位)是: 0010001111010111000010100011110101110000101000111101

     至于0.58 * 100的具体浮点数乘法, 我们不考虑那么细,就以模糊的心意来看:0.58*100=57.999999999。那么intval一下,自然就是57了。

     可见, 这个问题的关键点就是: “你看似有穷的小数, 在计算机的二进制表示里却是无穷的”。

二、php数组合并

    一提到数组合并,我们会想到array_merge函数或者array_merge_recursive函数,其实还有一种方式,这种方式大家平时很少想到,就是“+”运算符。我们分别看一下他们的用法:

    1、array_merge在数组的下标为整数类型时:

$arr1 = array(1=>1,2=>2,3=>3);
$arr2 = array(1=>2,2=>3,3=>4);
$arr3 = array_merge($arr1,$arr2);
print_r($arr3);
//输出为
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 2 [4] => 3 [5] => 4 ) 
   我们可以看到原有数组的下标丢弃,然后重新按照原来数组的顺序生成了一个新的合并后的数组。

    2、array_merge在数组的下标为字符串类型时:

$arr1 = array('aa'=>1,'bb'=>2,'cc'=>3);
$arr2 = array('bb'=>'b','cc'=>'c','dd'=>4);
$arr3 = array_merge($arr1,$arr2);
print_r($arr3);
//输出为
Array ( [aa] => 1 [bb] => b [cc] => c [dd] => 4 ) 
    我们可以看到数组的下标保留,但是如果原数组中存在下标一致的情况,后面数组的值就覆盖前面数组的值。

   3、array_merge_recursive在数组的下标为整数类型时:

$arr1 = array(1=>1,2=>2,3=>3);
$arr2 = array(1=>2,2=>3,3=>4);
$arr3 = array_merge_recursive($arr1,$arr2);
print_r($arr3);
//输出为
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 2 [4] => 3 [5] => 4 ) 

   发现效果与array_merge相同。

   4、array_merge_recursive在数组的下标为字符串类型时:

$arr1 = array('aa'=>1,'bb'=>2,'cc'=>3);
$arr2 = array('bb'=>'b','cc'=>'c','dd'=>4);
$arr3 = array_merge_recursive($arr1,$arr2);
print_r($arr3);
//输出为
Array ( [aa] => 1 [bb] => Array ( [0] => 2 [1] => b ) [cc] => Array ( [0] => 3 [1] => c ) [dd] => 4 ) 

   我们发现下标保留,而且如果原数组有下标一致的情况,也不会出现数值覆盖的情况。而是生成一个数组存放这些值。

   5、当采用“+”运算符时:

$arr1 = array(1=>1,2=>2,3=>3);
$arr2 = array(1=>2,2=>3,3=>4);
$arr3 = $arr1+$arr2;
print_r($arr3);
//输出为
Array ( [1] => 1 [2] => 2 [3] => 3 ) 
$arr1 = array('aa'=>1,'bb'=>2,'cc'=>3);
$arr2 = array('bb'=>'b','cc'=>'c','dd'=>4);
$arr3 = $arr1+$arr2;
print_r($arr3);
//输出为
Array ( [aa] => 1 [bb] => 2 [cc] => 3 [dd] => 4 ) 

   这个我们就可以知道,不论下标类型为数字还是字符串,如果原数组存在下标一致的情况,那么就不在存储后面数组的数据。其实“+”的作用就是补全的功能,将前面数组中下标还未出现的数据由后面数组补全到这里面。

文章评论

鲜为人知的编程真相
鲜为人知的编程真相
 程序员的样子
程序员的样子
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
每天工作4小时的程序员
每天工作4小时的程序员
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
我是如何打败拖延症的
我是如何打败拖延症的
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
代码女神横空出世
代码女神横空出世
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序员和编码员之间的区别
程序员和编码员之间的区别
漫画:程序员的工作
漫画:程序员的工作
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
老程序员的下场
老程序员的下场
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
我的丈夫是个程序员
我的丈夫是个程序员
Java程序员必看电影
Java程序员必看电影
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
一个程序员的时间管理
一个程序员的时间管理
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员的鄙视链
程序员的鄙视链
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
10个调试和排错的小建议
10个调试和排错的小建议
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
编程语言是女人
编程语言是女人
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
旅行,写作,编程
旅行,写作,编程
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
程序员必看的十大电影
程序员必看的十大电影
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员都该阅读的书
程序员都该阅读的书
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有