在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