• PHP 浮点型与整型比较的小坑


    今天我们来看一个在 PHP 中比较有意思的事:浮点数(floats)

    <?php
    die(var_dump(1200.85 * 100 === 120085));

    你认为上面的代码会出现什么结果呢?1. true 2. false 3. 这种比较视情况而定

    其实很简单,因为在这里,我们使用了 === 来做比较,所以这个结果很清晰的就是 false,
    因为我们左边是一个 floats 类似的数,右边是一个 int 类型的数。
    这是没什么可以特别讨论的。

    那如果是这样呢?

    <?php
    die(var_dump(1200.85 * 100 == 120085));

    就是我们使用 == 来比较的时候呢?

    你可能会这样想:左边 120085,右边 120085,所以结果是 true。

    如果你这样想的话,那你就错了。其实你运行上面的代码,结果回是 false。

    然而,我是说然而!你再尝试修改一下数字,在运行一次代码,比如这样:

    <?php
    die(var_dump(1200.81 * 100 == 120081));

    你会发现结果非常神奇,这个时候结果是 true,所以说,这种比较其实还真是视情况而定

    那么问题出现在哪里呢?我们试着运行下面的代码:

    <?php 
    var_dump(1200.85 * 100);
    die(var_dump(120085));

    结果会类似这样:

    float(120085) int(120085)

    好像没看出什么核心区别,我们这样再试试:

    die(var_dump(120085 - 1200.85 * 100));

    这个时候的结果应该是这样:

    float(1.4551915228367E-11)

    这就说明问题了,其实这个结果并不是 0 ,而是一个很小的 floats 类似的数。
    如果你看 PHP 文档的时候:http://php.net/manual/zh/language.types.float.php
    有注意那个很大的 Warning 的话,你应该就会明白:这里的核心问题其实就是浮点数的精度!

    那这样的话,我们如何比较才是我们期望的值呢?

    答案就是使用 round() 函数,像是这样:

    die(var_dump(round(1200.85 * 100) == 120085));

    所以吧,在使用 PHP 做这些精度计算比较的时候,一定要实测它的比较结果,或者是使用一些保险的手段进行比较,不然就会吃大亏!

  • 相关阅读:
    【java】详解java多线程
    【java】switch case支持的6种数据类型
    【Java】详解java对象的序列化
    【java】详解I/O流
    【java】自定义异常类
    【java】详解集合
    【NotePade++】NotePade++如何直接编译运行java文件
    【java】JVM的内存区域划分
    Unicode和UTF的关系
    【java】解析java中的数组
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15453006.html
Copyright © 2020-2023  润新知