php+获得小数位数,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类型,为何最后少了一位呢又? 暂时不明白

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值