在PHP中整数检查

我正在用PHP编写一个赔率转换器,并且遇到了将小数赔率转换为小数赔率的代码

function dec2frac($dec) { 
    $decBase = --$dec; 
    $div = 1; 
    do { 
        $div++; 
        $dec = $decBase * $div; 
    } while (intval($dec) != $dec); 
    if ($dec % $div == 0) { 
        $dec = $dec / $div; 
        $div = $div / $div; 
    } 
    return $dec.'/'.$div; 
} 

当我测试代码时,它有时会在计算中成功,有时尝试加载页面一段时间没有成功,所以我认为它以某种方式卡在循环中。 我将时间限制设置为1秒,并在循环中回显,这证实了我的怀疑。 我将这两个回声添加到循环中,以便我可以看到出错的地方。

echo "$dec $div<br/>";
echo var_dump(intval($dec) == $dec)." $dec is int<br/>";

打印输出失败时的示例,使用decimal = 1.6

1.2 2
bool(false)1.2是int
1.8 3
bool(false)1.8是int
2.4 4
bool(false)2.4是int
3 5
bool(false)3是int //应该在这里打破并返回3/5
3.6 6
bool(false)3.6是int
4.2 7
bool(false)4.2是int

成功时打印输出示例,使用十进制= 1.8

1.6 2
bool(false)1.6是int
2.4 3
bool(false)2.4是int
3.2 4
bool(false)3.2是int
4 5
bool(true)4是int

为什么有时不认识整数? 我怎样才能解决它,所以当找到一个整数时它退出循环?


它看起来像一个浮动的精确舍入错误。 intval($ dec)和$ dec似乎是相等的,但实际上不是。 差异可以忽略不计,但严格的平等失败。

在我的64位系统上,精度为1E-15,该功能起作用,其循环精度为1E-16。

通常,要避免严格比较两个浮点数。 如果它们的差值小于阈值,则两个浮标将被视为“相等”。 有很多方法可以计算这个阈值(google为“确定机器精度”),因为它在任何地方都不一样。

因为在我的PHP.INI中我有默认值

; The number of significant digits displayed in floating point numbers.
; http://php.net/precision
precision = 14

那么即使一个是3而另一个是3.0000000000044,并且菱角不被注意,两个数字也是相等的。

精度= 18, $dec表示不是你所期望的:

1.20000000000000018
1.80000000000000027
2.40000000000000036
3.00000000000000044

尝试:

function dec2frac($dec) {
    $decBase = --$dec;
    $div = 1;
    do {
        $div++;
        $dec = $decBase * $div;
    } while (abs(intval($dec) - $dec) > 1e-15);
    if (($dec % $div) == 0) {
        $dec = $dec / $div;
        $div = $div / $div;
    }
    return $dec.'/'.$div;
}
链接地址: http://www.djcxy.com/p/59147.html

上一篇: Integer check in PHP

下一篇: Have $this in PHP implicit function before PHP 5.4.0