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浮点数精度丢失问题解决方案 - http://www.wlphp.com/?post=345