php精度问题,出现小数精度丢失的原因?

用户投稿 147 0

关于“php双精度”的问题,小编就整理了【4】个相关介绍“php双精度”的解答:

出现小数精度丢失的原因?

两个例子:

在js中:0.1+0.2 != 0.3 而是 等于0.300000000004 //这跟js默认采用双精度存储小数有关系

在php中9.45*100%100 != 45而是等于44 //这跟php取余运算时是先取整再取余有关系

以上两种情况的根本原因应该是小数在计算机存储时精度丢失导致的.

因为有些小数在计算机使用二进制方式表示时无法准确的表示出来,类似于十进制中的1/3一样,无理数,无限循环.

可是计算机存储小数的类型不管是float还是double都是有位数限制的,所以他们存储的只是一个近似值,这就导致了精度丢失.

因为经度丢失了,所以有些时候运算结果就会跟我们预想的不太一样了.

什么是单精度和双精度数据?

含义:表明单精度和双精度精确的范围不一样。

单精度,也即float,一般在计算机中存储占用4字节,也32位,有效位数为7位;

双精度(double)在计算机中存储占用8字节,64位,有效位数为16位。

原因:不管float还是double 在计算机上的存储都遵循IEEE规范,使用二进制科学计数法,都包含三个部分:符号位,指数位和尾数部分。其中float的符号位,指数位,尾数部分分别为1, 8, 23. 双精度分别为1, 11, 52。

精度主要取决于尾数部分的位数,float为23位,除去全部为0的情况以外,最小为2的-23次方,约等于1.19乘以10的-7次方,所以float小数部分只能精确到后面6位,加上小数点前的一位,即有效数字为7位。 类似,double 尾数部分52位,最小为2的-52次方,约为2.22乘以10的-16次方,所以精确到小数点后15位,有效位数为16位。

单精度:单精度数是指计算机表达实数近似值的一种方式。VB中Single(单精度浮点型)变量存储为IEEE32位(4个字节)浮点数值的形式,它的范围在负数的时候是从-3.402823E38到-1.401298E-45,而在正数的时候是从1.401298E-45到3.402823E38。双精度:双精度浮点数(double)是计算机使用的一种数据类型,使用64位(8字节)来存储一个浮点数。它可以表示十进制的15或16位有效数字,其可以表示的数字的绝对值范围大约是:4.9x10-324 ~1.7x10308。IEEE754为其定制标准。单精度,也就是float,在32位机器上用4个字节来存储的;而双精度double是用8个字节来存储的,这是他们最本质的区别。由于存储位不同,他们能表示的数值的范围就不同,也就是能准确表示的数的位数就不同。

编程里的double是什么意思,能否通俗点。双精度?

通俗点就是精确度高,可以精确到小数点位数多。。双精度(double)型占8个字节(64位)内存空间,数值范围为1.7E-308~1.7E+308,可提供16位有效数字。

单精度和双精度怎么用?怎么区别?

1,单精度,也就是 float ,在 32 位机器上用 4 个字节来存储的;而双精度double是用 8 个字节来存储的,这是他们最本质的区别。

2,由于存储位不同,他们能表示的数值的范围就不同,也就是能准确表示的数的位数就不同。

3,单精度小数点后面共能精确到7位小数。双精度可精确到15位小数。

到此,以上就是小编对于“php双精度”的问题就介绍到这了,希望介绍关于“php双精度”的【4】点解答对大家有用。

抱歉,评论功能暂时关闭!