Python 检查浮点模int是否为有限序数

Python 检查浮点模int是否为有限序数,python,floating-point,modulo,Python,Floating Point,Modulo,在for循环中,我将时间积分为常数,分数时间步长,dt。我只想保存积分(有限顺序)时间点的模拟结果。我的解决办法如下: dt = 0.1 steps = 100 for step in range(steps): if (step*dt) % 1 == 0.0: print step 我从来没有真正相信浮点数上的模运算。有没有更好的方法来检查浮点数是整数还是我只是有点偏执 这在任何编程语言中都是危险的。在您的示例中,0.1不能用In浮点精确表示,因此测试将永远不会通过

在for循环中,我将时间积分为常数,分数时间步长,
dt。
我只想保存积分(有限顺序)时间点的模拟结果。我的解决办法如下:

dt = 0.1
steps = 100

for step in range(steps):
    if (step*dt) % 1 == 0.0:
        print step

我从来没有真正相信浮点数上的模运算。有没有更好的方法来检查浮点数是整数还是我只是有点偏执

这在任何编程语言中都是危险的。在您的示例中,
0.1
不能用In浮点精确表示,因此测试将永远不会通过(我想它可能在2^24次迭代后通过)。在许多情况下,步长可能没有精确的浮点表示,因此累积的舍入误差会导致测试错误触发/未触发。在其他情况下,随着累积值变大,最终由于指数的增加,它将开始失去精度(在您的示例中,假设Python默认使用单精度,那么在20971529次迭代之后,您将得到一个错误的触发器)


尝试找到一种避免对浮点值执行相等测试的方法(检查整数值就是这样一种测试)。因此,在您的情况下,只需测试
步骤%10

我也不信任浮点数,您可以使用,也可以使用。我更喜欢类型。

2^24是从哪里冒出来的,还是有什么意义?对IEEE浮点进行任何操作都会给您带来错误,即使是第%10步。@Dhaivat:一个单精度浮点有23个尾数位(+1),所以经过大约那个数量的迭代之后,OP的
步骤*dt
将没有小数部分(假设Python默认使用单精度)。你可能已经猜到了,我根本不懂Python;
step
在这里是整数类型还是浮点类型?@Dhaivat:即使
step
是浮点类型,只要
steps
小于2^24,这应该可以正常工作。“0.1不能精确表示为[]浮点类型”,但“这样测试就永远不会通过”不会出现。试试看。