带小数的模数

Modulus with decimals

我很难理解这段代码的模数部分。

我试图只在模数为 0 时打印 num,也就是说它是偶数。 如果我将数字设置为 100 并将评分设置为 1.5,我将得到结果。但是,如果我将速率值更改为 .25 .5 .75 以外的任何值,我将一无所获。

这里有一个例子:如果我使用 100 作为数字,1.4 作为比率,我应该得到 7.14.21 等等,因为 1.4 平均进入这些数字。但是,它没有输出。

初步搜索告诉我模数不适用于小数但它适用于 .5 增量。

非常感谢任何意见。

def findnum(number, rate): 
    for num in range(pinumber):
        if num %(rate) == 0:
            if num != 0:                 
                print(num)

浮点数运算不准确。由于这个原因 7 % 1.4 不会给出精确的 0,而是一个接近 0 的数字。如果您在代码中将 num % rate == 0 替换为 num % rate < tolerance 之类的内容,其中 tolerance 是一个小正数数字(例如,tolerance = 10**(-10)),它在大多数情况下应该有效。但是,这仍然会为某些值带来不正确的结果(例如尝试 num = 5rate = 5/3),因为 Python 可能高估 num/rate 的值,然后 num % rate 将被计算为接近 rate 而不是 0。因此,更安全的解决方案是使用 abs(num/rate - round(num/rate)) < tolerance 等条件.

用小数除法时,总是会出现精度误差的问题。这意味着,7 % 1.4 不是 0,而是 4.440892098500626e-16,要使您的代码正常工作,您必须使用 decimal 模块将数字存储为字符串。

from decimal import Decimal
def findnum(number, rate): 
    for num in range(number):
        if num % Decimal(str(rate)) == 0:
            if num != 0:                 
                print(num)

由于 python 中的小数精度,7 % 1.4 没有精确地给出 0。

因此,一种方法是使用标准数学库中的 'isclose' 函数来补偿小数精度。

if isclose(num % rate, abs_tol=1e-9):
    ...

或者,您可以使用 Decimal 库,它提供更好的精度,但需要进行字符串转换。