美文网首页
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浮点型比较踩到的坑

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

  • PHP基础知识(1)

    1.列举php常用的数据类型 整数型 Integer 布尔类型 Boolean 浮点型 Float浮点型 字符数 ...

  • PHP学习笔记

    PHP数据类型 php有7种数据类型 : 整型 | 浮点型 | 字符串 | boolean | Null | 数组...

  • PHP自学计划-数据类型-05

    PHP有7种数据类型 String(字符串) Integer(整型) Float(浮点型) Boolean(布尔型...

  • 从0到1学习网络安全 【PHP基础-数据类型】

    PHP 数据类型 String(字符串), Integer(整型), Float(浮点型), Boolean(布尔...

  • php入门--数据类型

    php的数据类型如下:String(字符串), Integer(整型), Float(浮点型), Boolean(...

  • PHP学习2

    PHP支持8种基本的数据类型 四种标量类型:+boolean(布尔型)+nteger(整型)+float(浮点型,...

  • php浮点数比较

    ```

  • PHP面试常问问题

    PHP变量类型: Boolean 布尔类型 Integer 整型 Float 浮点型 String 字符串 Arr...

  • PHP-整型浮点型

    1. 不同进制数表示 十六进制:0x或0X开头十进制: 1-9开头八进制:0开头2进制:0b开头 2. 字节数 与...

网友评论

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

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