Python 在浮点数学中,当一个数除以它的除数时,如果有,结果不是整数浮点

Python 在浮点数学中,当一个数除以它的除数时,如果有,结果不是整数浮点,python,python-3.x,floating-point,division,floating-accuracy,Python,Python 3.x,Floating Point,Division,Floating Accuracy,当我在python中运行此代码时 def is_cool(n): if (n/7).is_integer(): return True else: return False for i in range(0,1000000,7): if not is_cool(i): print(i, " is where the error is") 它不打印任何东西。我知道有些地方浮点数学总是正确的。这是其中之一

当我在python中运行此代码时

def is_cool(n):
    if (n/7).is_integer():
        return True
    else:
        return False

for i in range(0,1000000,7):
    if not is_cool(i):
        print(i, " is where the error is")
它不打印任何东西。我知道有些地方浮点数学总是正确的。这是其中之一吗?

(n/7)。Is_integer()
仅在
n%7==0时返回
True

现在从
0
开始运行循环,步长为
7

您的
i
将是
0、7、14、21、


is_cool(i)
将始终为上述
i
的每个值返回
True
,但在您所述的
if
条件下
if is_cool(i)
将始终为
False
,因此code不会打印任何内容

IEEE-754将一个数字除以它的一个除数返回精确结果

IEEE 754-2008 4.3规定:

…除非另有规定,否则每项操作的执行应视为首先产生一个中间结果,该结果精确到无限精度且范围无限,然后根据本条中的一个属性对该结果进行四舍五入

当中间结果可表示时,所有舍入属性将其舍入到自身;舍入仅在值不可表示时才更改该值。5.4中给出了划分规则,它们没有说明上述例外情况

可表示数除以可表示除数所得的商必须是可表示的,因为它的有效位不能超过分子。因此,将一个数除以它的一个除数将返回一个精确的结果


请注意,此规则适用于除法的实际操作数。当源代码中有一些数字时,例如
12345678900123456890/7
,这些数字首先转换为数字格式。如果它们不能以该格式表示,则必须生成某种近似值。这是一个与部门运作方式不同的问题。

你能把你的期望和你所得到的包括在内吗?还有,为什么不使用
%
@TomKarzes呢?我想OP是在问,一个浮点数除以它的一个除数,肯定会得到一个整数浮点。我认为这是有保证的,但我对IEEE754的了解还不够(一点也不多),无法理解say@juanpa.arrivillaga嗯,你可能是对的。如果分子和分母都是整数,并且都可以精确表示(即,它们不会太大),那么使用适当的除法器,我希望得到精确的结果。如果
n
是一个可表示为IEEE754 float的整数,则其所有整数除数也可以表示。但是,您的测试将产生许多误报,例如,大于
2**53
的每个(双精度)浮点都是一个整数,因此您的测试对于大数字来说将变得毫无意义。这并不能解决问题。他们在问,是否有一种情况不是这样的,即,如果一个整数浮点数被另一个整数浮点数(它的除数)除,结果总是整数浮点数?我相信这是可以保证的,但我对浮点表示的了解还不够,无法回答哦。。。事实上,问题语言没有足够的相关性,因此我认为问题与打印错误(n/7)有关。is_integer()仅在n%7==0时返回True”-由于舍入错误,不为True。例如,它仍然为True。@user2357112supportsMonica哇,谢谢!你知道吗?或者你是怎么找到一个例子的?@peterduffy:我刚刚选了一个不可被7整除的大数字。当浮点除法的结果足够大时,结果将始终为整数,因为IEEE 754 binary64格式不能表示任何大于2**52的有限非整数值。