以下是我的问题的简化版本。这是一个for循环:
for ($i = 0.01; $i < 100; $i += 0.01) {
echo $i;
}
在某些时候,i
可能会输出51.189999999998。这产生了两个问题。首先,我无法使用fmod
或strpos
检测数字是整数还是小数。其次,它会影响输出的可读性。
我首先搜索了解决方案,我很惊讶我无法找到任何解决方案。我该如何解决这个问题?我尝试了小数点后3位,但这很麻烦,因为我打算将0.01之间的增量交替到较小的值,例如0.00001。我还尝试将i
加1,然后乘以0.01
。这有效,但i
超过32位最大整数。有人可以建议一个干净的解决方法吗?
哦,它解决了物理问题,通过逐步消耗小的离散时间值来解决使用数学难题。
答案 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
永远不会出现任何明显的错误。