我偶然发现了一个非常奇怪的错误。阅读代码中的注释以了解错误到底是什么,但本质上是变量模 1 返回 1(但它不等于 1!)。我假设存在显示问题,其中浮点数非常接近 1,但不完全一样。但是,它应该模为零。我无法轻松测试这种情况,因为 (last % 1) != 1.0 !当我尝试将相同的数字插入另一个 python 终端时,一切都正常。这是怎么回事?

def r(k,i,p):
    first = i*p
    last = first + p

    steps = int((i+1)*p) - int(i*p)
    if steps < 1:
        return p
    elif steps >= 1:
        if k == 0:
            return 1 - (first % 1)
        elif k == steps:
            if i == 189:
                print last, 1, type(last), last % 1, last - int(last)
                # Prints: 73.0 1 <type 'float'> 1.0 1.0
                print last % 1 == 1 # Returns False
            if last % 1 == 1.0:
                return 0
            return (last % 1)
        else:
            return 1
有帮助吗?

解决方案

欢迎到IEEE754,享受您的逗留

其他提示

打印不显示号码的全精度的存储,您可以使用repr()做到这一点。

>>> last=72.99999999999999
>>> print last, 1, type(last), last % 1, last - int(last)
73.0 1 <type 'float'> 1.0 1.0
>>> print last % 1 == 1
False
>>> print repr(last), 1, type(last), repr(last%1), repr(last - int(last))
72.999999999999986 1 <type 'float'> 0.99999999999998579 0.99999999999998579
>>> 

您可以尝试 math.fmod 的函数,而不是last % 1 ,也许它更适合于你的问题。 或者你可以重新制定你的问题在整数空间。

无论如何,这不是好的做法使用平等==操作,由于即使从像0.1 + 0.2 == 0.3 seemigly琐碎操作不精确的结果进行比较的浮点值

如果您需要任意精度,有一些项目可以做到这一点。 gmpy 处理多精度整数, 数学 看起来不错并且 大浮点数 其中包含 MPFR。通过 gnibbler 的回答,你所拥有的可能就足够了,但是,以防万一。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top