PHP在添加时浮动精度导致错误

时间:2018-03-06 05:31:01

标签: php for-loop floating-point floating-accuracy

以下是我的问题的简化版本。这是一个for循环:

for ($i = 0.01; $i < 100; $i += 0.01) {
    echo $i;
}

在某些时候,i可能会输出51.189999999998。这产生了两个问题。首先,我无法使用fmodstrpos检测数字是整数还是小数。其次,它会影响输出的可读性。

我首先搜索了解决方案,我很惊讶我无法找到任何解决方案。我该如何解决这个问题?我尝试了小数点后3位,但这很麻烦,因为我打算将0.01之间的增量交替到较小的值,例如0.00001。我还尝试将i加1,然后乘以0.01。这有效,但i超过32位最大整数。有人可以建议一个干净的解决方法吗?

哦,它解决了物理问题,通过逐步消耗小的离散时间值来解决使用数学难题。

2 个答案:

答案 0 :(得分:1)

以浮点类型的整数值计算数字。我不熟悉PHP并且documentation不清楚(它显示了一个LNUM语法对象的浮点文字,它与整数文字重叠而没有说明它们是如何区分的),但这可能有效:

for ($i = 1.; $i < 10000.; $i += 1.) {
    $t = $i * .01;
    echo $t;
}

请注意,在PHP中,浮点类型的特征可能会有所不同。在使用IEEE 754基本64位二进制浮点的系统上,在计数中出现舍入错误之前,您可以计算最多2 53 的整数值。

答案 1 :(得分:0)

有一种更简洁的方法可以使用我所监督的舍入方式:

$inc = pow(10, -1 * $precision)
for ($i = 0; $i < $max; $i = round($inc + $i, $precision)) {
    echo $i;
}

这比echo round($i, $precision)更好,因为它可以确保i永远不会出现任何明显的错误。