最新公告
  • 欢迎您光临波比源码,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • PHP浮点数用法与问题总结

    在php浮点数处理函数在php中有很多,包括有如ceil,floor,round,intval 经过他们处理之后可返回我们想要的浮点数小数位了,下面我来介绍一些关于php浮点数用法与问题分析。

    一,php浮点数用法

    PHP浮点类型取整之ceil — 进一法取整

    说明:float ceil (float value)

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

    例子1. ceil() 例子,实例代码如下:

    1. <?php 
    2. echo ceil(4.3); // 5 
    3. echo ceil(9.999); // 10 
    4. ?> 

    PHP浮点类型取整之floor — 舍去法取整

    说明:float floor (float value)

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

    例子1. floor() 例子,代码如下:

    1. <?php 
    2. echo floor(4.3); // 4 
    3. echo floor(9.999); // 9 
    4. ?> 

    PHP浮点类型取整之round — 对浮点数进行四舍五入

    说明:float round ( float val [, int precision] )

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

    例子1. round() 例子,代码如下:

    1. <?php 
    2. echo round(3.4); // 3 
    3. echo round(3.5); // 4 
    4. echo round(3.6); // 4 
    5. echo round(3.6, 0); // 4 
    6. echo round(1.95583, 2); // 1.96 
    7. echo round(1241757, -3); // 1242000 
    8. echo round(5.045, 2); // 5.05 
    9. echo round(5.055, 2); // 5.06 
    10. ?> 

    PHP浮点类型取整之intval—对变数转成整数型态

    例子intval(),代码如下:

    1. <?php 
    2. echo intval(4.3); //4 
    3. echo intval(4.6); // 4 
    4. ?> 

    二,浮点数转成字符串

    PHP内置的echo, var_dump, json_encode,字符串拼接等函数(指令)在显示浮点数时都有问题,导致精度丢失.实例代码如下:

    1. <?php 
    2.    $a = 1315537636.338467; 
    3.    printf("%f"$a); echo "n"
    4.    echo $a . "n"
    5.    echo $aecho "n"
    6.   ?> 
    7. /* 
    8. 结果 
    9.   1315537636.338467 
    10.   1315537636.3385 
    11.   1315537636.3385 
    12. */ 

    也就是说,用PHP最顺手的方法将浮点数转成字符串或者显示是不行的,必须使用printf/sprintf将浮点数转成字符串.

    三,一个常见问题的解答

    不过,我当时遗漏了一点,也就是对于如下的这个常见问题的回答,实例代码如下:

    1. <?php 
    2.     $f = 0.58;  
    3.     var_dump(intval($f * 100));   
    4. ?> 

    为啥输出57

    为啥输出是57啊? PHP的bug么?我相信有很多的同学有过这样的疑问,因为光问我类似问题的人就很多,更不用说bugs.php.net上经常有人问…

    要搞明白这个原因,首先我们要知道浮点数的表示(IEEE 754):

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

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

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

    尾数:表示数据小数点后的有效数字.

    这里的关键点就在于,小数在二进制的表示,关于小数如何用二进制表示,大家可以百度一下,我这里就不再赘述,我们关键的要了解, 0.58 对于二进制表示来说,是无限长的值(下面的数字省掉了隐含的1)..

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

    0010100011110101110000101000111101011100001010001111 

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

    0010001111010111000010100011110101110000101000111101

    而两者的二进制, 如果只是通过这52位计算的话,分别是: 

    0.58 -> 0.57999999999999996 

    0.57 -> 0.56999999999999995

    至于0.58 * 100的具体浮点数乘法, 我们不考虑那么细, 有兴趣的可以看(Floating point), 我们就模糊的以心算来看… 0.58 * 100 = 57.999999999

    那你intval一下, 自然就是57了….

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

    四,float(浮点数)比较的问题

    最近在开发一个合同管理系统的时候,涉及到两个浮点数比较,算是把我郁闷惨了。

    在N久以前,就不晓得从哪里听来的一个“不要用等号去比较浮点数”的“真理”,自己平时也在用,好像没有出现啥问题,可这次问题总算是来了,实例代码如下:

    1. <?php  
    2. $sum = "12300.00";  
    3. $a   = "10000.30";  
    4. $b   =  "2000.30";  
    5. $c   =   "299.40";  
    6. $sum = (float) $sum;  
    7. $s = (float) ($a+$b+$c);  
    8. var_dump($sum$s);  
    9. var_dump($sum==$s); 
    10. /* 
    11. 结果是: 
    12. float(12300)  
    13. float(12300)  
    14. bool(false) 
    15. */ 

    后来才知道在PHP中,要比较两个浮点数的大小,可以用bccomp(参数1,参数2,小数位)来比较,实例代码如下:

    1. <?php  
    2. $sum = "12300.00";  
    3. $a   = "10000.30";  
    4. $b   =  "2000.30";  
    5. $c   =   "299.40";  
    6. $sum = (float) $sum;  
    7. $s = (float) ($a+$b+$c);  
    8. var_dump($sum$s);  
    9. var_dump(bccomp($sum,$s,2)); 
    10. /* 
    11. 结果: 
    12. float(12300)  
    13. float(12300)  
    14. int(0) // 0表示两个浮点数值相等 
    15. */ 

    bccomp函数具体用法参与PHP手册.

    波比源码 – 精品源码模版分享 | www.bobi11.com
    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

    波比源码 » PHP浮点数用法与问题总结

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    波比源码
    一个高级程序员模板开发平台
    升级波友尊享更多特权立即升级