带小数的模数
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 = 5
和 rate = 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 库,它提供更好的精度,但需要进行字符串转换。
我很难理解这段代码的模数部分。
我试图只在模数为 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 = 5
和 rate = 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 库,它提供更好的精度,但需要进行字符串转换。