美文网首页
php浮点型比较踩到的坑

php浮点型比较踩到的坑

作者: 胡乱唱歌ing | 来源:发表于2018-12-03 17:49 被阅读0次

    因为最近要做一个图表,x轴的叠加为0.1,但是在进行浮点类型比较时出现一个头疼的问题,废话不说请看以下案例

    for($i=0.1;$i<=1.0;$i+=0.1)
    {
       if($i == 1.0)
       {
           echo "ok"; 
       }else 
       {
           echo $i."<br/>";
       }
    }
    

    以上代码没有输出OK的,echo $i;能正确输出 0.1 - 1;
    于是我把上面的代码改成这样子

    $c = 0;
    for($i=0.1;$i<=1.0;$i+=0.1)
    {
        $c = $i;
    }
    var_dump($c);//float(1)
    var_dump(1.0);//float(1)
    var_dump($c == 1.0);//bool(false)
    printf("%.20f",$c); //0.99999999999999988898
    echo "\n";
    printf("%.20f",1.0); //1.00000000000000000000
    echo "\n";
    

    问题显而易见了,c变量并不是等于1.0而是0.99...小数
    参考:http://www.laruence.com/2013/03/26/2884.html
    有限的小数在二进制中可能是无限长的小数

    for($i=0.1;$i<=1.0;$i+=0.1)
    {
       
       //使用bccomp函数对浮点数进行比较
        if(bccomp($c,1.0) == 0)
        {
            echo "ok"; 
        }else 
        {
            echo $i."<br/>";
        }
    }
    

    果然,转成string类型在进行比较就可以了。。
    其实PHP也提供了高精度数字的运算函数
    bcadd — 将两个高精度数字相加
    bccomp — 比较两个高精度数字,返回-1, 0, 1
    bcdiv — 将两个高精度数字相除
    bcmod — 求高精度数字余数
    bcmul — 将两个高精度数字相乘
    bcpow — 求高精度数字乘方
    bcpowmod — 求高精度数字乘方求模,数论里非常常用
    bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”
    bcsqrt — 求高精度数字平方根
    bcsub — 将两个高精度数字相减
    http://php.net/manual/zh/function.bccomp.php

    相关文章

      网友评论

          本文标题:php浮点型比较踩到的坑

          本文链接:https://www.haomeiwen.com/subject/cwaycqtx.html