【问题标题】:PHP intval function rounds down an integer numberPHP intval 函数舍入一个整数
【发布时间】:2015-12-01 08:35:10
【问题描述】:

这是我在 PHP 中见过的最愚蠢的行为。

$num = 4400 / 1.1;
echo doubleval($num); // prints 4000
echo intval($num); // prints 3999

为什么会发生这种情况以及如何解决?

【问题讨论】:

  • 您期望什么样的答案:深入比较 intval 的内部工作原理和隐式转换为字符串,包括浮点/双精度的 IEEE 754 表示和 C 标准的规则打印双精度库时,为什么 php 开发人员不关心它或者如何(以及何时)处理这些事情(通常或针对这种特殊情况)?
  • 顺便说一句:因为您对 javascript 标签有一些看法:jsfiddle.net/9e4ssjmj ;-)

标签: php casting int rounding


【解决方案1】:

0.1 和 0.7 之类的数字不适用于二进制表示。
阅读“警告”部分here

如果你需要除以 1.1,我建议你这样做:

$num = (4400 * 10) / 11;

$num = (4400 * 10.0) / 11;

因为 11 可以精确地表示为二进制数。

intval() 会将不精确的结果截断到最近的下面
doubleval() 将四舍五入到最接近的值。

【讨论】:

    【解决方案2】:

    这个问题继承自C语言。

    比较浮动值时会有细微差别,

    this,回复this

    试试这个,

    $tot = 0;
    $ans = (float)101;
    for($i=1; $i<= 10; $i++){
        $tot = $tot + 10.1;
    }
    
    if (abs(($tot-$ans)/$tot) < 0.00001) {
        echo '<br />Both are equal ';
    }
    else{
        echo '<br />Both are not equal ';
    }
    

    abs() 输出为

    Both are equal 
    

    没有abs() 输出是

    Both are not equal
    

    上面删除abs(),即使值相同也会输入else(小数会有小差异)

    所以用abs()来解决这个问题

    【讨论】:

      猜你喜欢
      • 2011-05-13
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2011-01-05
      相关资源
      最近更新 更多