码迷,mamicode.com
首页 > Web开发 > 详细

php的小数位数最长多少位

时间:2019-11-26 19:29:32      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:方式   符号位   决定   value   数据   基础   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类型,为何最后少了一位呢又? 暂时不明白

php的小数位数最长多少位

标签:方式   符号位   决定   value   数据   基础   php   内存   补齐   

原文地址:https://www.cnblogs.com/lz0925/p/11937461.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!