PHP菜鸟博客_共同学习分享PHP技术心得【PHP爱好者】
PHP浮点数精度丢失问题解决方案
2022-5-16 菜鸟站长


        先看下面这段代码:



        //$f=16.40;

        $f=0.57;

        echo   intval($f * 100);

        echo "\r\n";

        echo $c = bcmul($f, 100, 0); 

        echo "\r\n";







        上面的运行结果分别是:56      57 







结果可能有点出乎你的意外,PHP遵循IEEE 754双精度.

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

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

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

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





再来看看小数用二进制怎么表示:乘2取整,顺序排列,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分,但是像0.57这样的小数像这样一直乘下去,小数部分不可能为0.有效位的小数用二进制表示却是无穷的.



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



如果只有52位的话,0.57 =》 0.56999999999999995





综上所述,我们在做在线支付等精度要求高的情况下,一定要使用php的bc库函数来做运算。


发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容