• php的小数位数最长多少位


    • 在php中,
        echo 0.1234567890123456;exit; 
        // 结果为:0.12345678901235, 整数部分为0时,最多到14位小数,如果后面还有,就自动四舍五入
    
        echo 781.1234567890123456;exit;
        // 结果为:781.12345678901, 整数部分为3位数时,最多11位小数 3+11=14
    
        echo 71231381.1234567890123456;exit;
        // 结果为:71231381.123457   整数为8位数时,最多6位小数   8+6=14
        即PHP中,一个浮点数的长度最多只能有 14个有效位(整数+小数)
    
    • 出现这种情况的原因是
    C中浮点数据类型有float和double两种。 (PHP中的float即C语言中的double,zval中的value是一个double类型的引用,所以PHP中的浮点数只有double类型)
    
    float大小为4字节,内存中的存储方式如下:
    
    符号位(1bit)指数(8bit)尾数(23bit)
    
    double大小为8字节,内存中的存储方式如下:
    
    符号位(1bit)指数(11bit)尾数(52bit)
    
    符号位决定浮点数的正负,0正1负。指数和尾数均从浮点数的二进制科学计数形式中获取。
    
    如,十进制浮点数2.5的二进制形式为10.1,转换为科学计数法形式为(1.01)*(10^1)。
    
    由此可知指数为1,尾数(即科学计数法的小数部分)为01。
    
     根据浮点数的存储标准,指数用移码表示。0的float类型移码为127(0111 1111),0的double类型移码为1023(011 1111 1111)。运算时,在0 的移码基础上加指数,得到的就是内存中指数的表示形式。尾数则直接填入,如果空间多余则以0补齐,如果空间不够则0舍1入。
    
    所以float和 double类型分别表示的2.5如下(二进制):
    
    符号位               指数                                       尾数
    
    0                     1000 0000                             010 0000 0000 0000 0000 0000
    
    0                     100 0000 0000 0100                    0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
    
     
    
    精度:
    
     float和double的精度是由尾数的位数来决定的。
    
     float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字; double:2^48 = 281474976710656,一共15位,
     同理,double的精度为14~15位。
     
    

    但是 double 到了 PHP 中则只有 13~14 位了,有点不明白,PHP的float类型明明是指向一个C语言double类型,为何最后少了一位呢又? 暂时不明白

  • 相关阅读:
    好友面板切换案例
    jquery
    H5 新增API
    深拷贝
    浅拷贝
    call bind apply
    像素鸟
    Django3.0
    三剑客-grep-awk-sed
    Linux中find命令详解
  • 原文地址:https://www.cnblogs.com/lz0925/p/11937461.html
Copyright © 2020-2023  润新知