为什么php的浮点数运算不准确

    xiaoxiao2025-10-06  11

    关于php浮点数,经常遇见预算不准确的情况

    例子:

    //例子 $a = 10.601; $b = 10.6009; echo $a- $b; // 结果如下 0.00010000000000154

    结果错误,why?

    why

    根本原因, 在某些情况下,2 进制无法精确表示 10 进制的小数部分。

    把 10 进制转化为 2 进制,需要进行如下换换算,下面以10.601为例

    整数部分

    连续用该整数除以2,取余数,然后商再除以2,直到商等于0为止。然后把得到的各个余数按相反的顺序排列。简称"除2取余法"。

    小数部分

    连续用改小数乘以2,取整数部分,然后小数部分再乘以2,直到小数部分为0为止 。然后把取出的整数部分按顺序排列。简称"乘2取整法"。

    10 (整数部分) 10/2=5---------0 5/2=2----------1 2/2=1----------0 1/2=1----------1 (10) 10=(1010) 2 0.601 小数部分 0.601*2=1.202 ----1 0.202*2=0.404 ----0 0.404*2=0.808 ----0 0.808*2=1.616-----1 0.616*2=1.232-----1 0.232*2=0.464-----0 0.464*2=0.928-----0 ...... (0.601)10 = (0.10011001......)2 我们发现会无限的循环下去,没法精确用2进制标识

    php浮点数

    浮点数,以64位的长度(双精度)为例, 会采用 1 位符号位(E), 11 指数位(Q), 52 位尾数(M)表示

    符号位:最高位表示数据的正负,0表示正数,1表示负数。指数位:表示数据以2为底的幂,指数采用偏移码表示尾数:表示数据小数点后的有效数字.

    只能有52位存储0.601部分,这样大家就能看出原因了。

    解决办法

    采用 “bc 数据函数” http://php.net/manual/zh/ref.bc.php

    $a = 10.601; $b = 10.6009; //echo $a- $b; echo bcsub($a , $b,4);
    最新回复(0)