PHP浮点数精度丢失问题解决方案

  • 内容
  • 评论
  • 相关

        先看下面这段代码:

        //$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库函数来做运算。

本文标签:

版权声明:若无特殊注明,本文皆为《菜鸟站长》原创,转载请保留文章出处。

本文链接:PHP浮点数精度丢失问题解决方案 - https://wlphp.com/?post=345

发表评论

电子邮件地址不会被公开。 必填项已用*标注