【问题标题】:php return wrong valuephp返回错误值
【发布时间】:2013-10-03 13:53:58
【问题描述】:

我正在尝试在 php 中进行计算:

echo (int)((0.1 + 0.7) * 20);

为什么返回 15

预期结果: 16

实际结果:15

【问题讨论】:

  • 几乎可以肯定是浮点舍入错误。
  • 为什么这里有jquery标签??删除它
  • 因为一些 jquery 用户可能会帮助我
  • 我猜这是因为 (0.1+0.7) *20 返回 15.9999998 并且将浮点数转换为整数总是向下舍入

标签: php


【解决方案1】:

这是由于 PHP 将小数转换为对应的二进制导致的,这会导致精度损失。

如果您需要高精度,请改用GMPbcmath 库。

【讨论】:

    【解决方案2】:

    你需要

    intval ((0.1 + 0.7) * 20);
    

    对不起,这是错误的,但这里有一个解决方法:

    $n= ( (0.1 + 0.7) * 20);  //=16
    $n2 = intval ($n."");     // cast it to string, then to int.
    echo $n2;
    

    【讨论】:

    • 完全一样
    • (0.1 + 0.7) * 20 = 16,没关系,那为什么还要使用强制转换呢?
    【解决方案3】:

    来自文档:http://php.net/manual/en/language.types.float.php

    浮点数的精度有限。尽管取决于系统,但 PHP 通常使用 IEEE 754 双精度格式,由于在 1.11e-16 的数量级四舍五入,这将给出最大的相对误差。非初等算术运算可能会产生较大的误差,当然,当多个运算复合时,必须考虑误差传播。

    此外,可以精确表示为以 10 为底的浮点数的有理数,例如 0.1 或 0.7,不具有精确表示为以 2 为底的浮点数,无论大小如何,它都在内部使用尾数。因此,它们不能被转换成它们内部的二进制对应物,而不会有小的精度损失。这可能会导致令人困惑的结果:例如, floor((0.1+0.7)*10) 通常会返回 7 而不是预期的 8,因为内部表示将类似于 7.9999999999999991118....

    你可以使用BC Math Functions

    $precision = 2;
    echo bcmul( bcadd("0.1","0.7",$precision) ,"20",$precision); // 16.00
    

    【讨论】:

      【解决方案4】:

      类型转换结果导致错误的数字echo ((0.1 + 0.7) * 20); 应该给出 16

      【讨论】:

      • 是的,它工作正常,但浮点到整数类型转换呢?
      【解决方案5】:

      看起来像一个舍入错误

      0.1 + 0.7 = 0.7999999999

      0.799999999 * 20 = 15.9999998

      int(15.9999998) = 15

      你必须对结果进行四舍五入。

      【讨论】:

        【解决方案6】:
        echo (int)(((0.1*10 + 0.7*10)/10) * 20);
        

        首先你需要去掉小数然后执行操作 否则不要类型转换

        echo (0.1+0.7)*20;
        

        【讨论】:

        • 不要将 float 类型转换为 int。
        【解决方案7】:

        您尝试过这种方法吗? :

        <?php
        $value = (0.1+0.7)*20;
        echo $value;
        ?>
        

        我的结果是 16

        【讨论】:

        • 是的,它工作正常,但是浮点到整数类型转换呢?
        • 您不必将结果转换为整数,因为一旦您使用 echo 打印它,它就会转换为它的字符串表示形式。如果要对结果进行四舍五入,请使用 round()。
        【解决方案8】:

        请阅读PHP documentation on foating point numbers。正如文档中所写,

        例如, floor((0.1+0.7)*10) 通常会返回 7 而不是预期的 8。

        处理浮点数时,使用BC Math 以获得正确的结果。

        【讨论】:

          【解决方案9】:

          使用round

          echo round((0.1 + 0.7) * 20);
          

          输出

          16
          

          【讨论】:

            【解决方案10】:

            让我们更准确地说:

            printf("%1\$.20f", 0.7); // output: 0.69999999999999995559
            printf("%1\$.20f", 0.1); // output: 0.10000000000000000555
            printf("%1\$.20f", (0.10000000000000000555+0.69999999999999995559)*20); // output: 15.99999999999999822364
            

            所以当你将最后一个数字转换为 int 时:

            echo (int)15.99999999999999822364; // output: 15
            

            【讨论】:

              猜你喜欢
              • 2017-06-07
              • 1970-01-01
              • 2012-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-11-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多