Python 整数意外结果

Python integer unexpected results

我正在使用集成到 Rhinoceros 5 应用程序中的 IronPython 2.7。 我有一个奇怪的 int() 函数结果:

import math

angle = 45.0
tangent = math.tan(math.radians(angle))
n = 12*tangent
print "angle: ", angle
print "tangent: ", tangent
print "n: ", n
print "int(n): ", int(n)

结果:

angle:  45.0
tangent:  1.0
n:  12.0
int(n):  11

因此,如上所述,int() 函数 returns 11 而不是 12。 我知道有一些浮点数问题,但这不应该与整数有关? 有谁知道为什么会这样?

感谢您的回复。

编辑:我添加了关于如何获得“12.0”的代码

你得到了 11.9999999999999982 !


如果您将以下行添加到您的代码中,您将获得惊人的结果

print "%.16f" % n

输出

11.9999999999999982

如何解决


您可能想试试这个:

from decimal import Decimal

k=Decimal(12.0)
print int(k) #prints 12

这会将 12.0(浮点数)转换为 Decimal 值。这种方法可以解决一些与浮动相关的问题。

为什么会这样


您可以阅读 this 并看到,例如,由于某些限制,2.675 可以表示为 2.67499999999999982236431605997495353221893310546875

在你的例子中,你得到了一个 接近 12 的数字。这就是 int 将其四舍五入为 11 的原因。例如:

>>> int(11.9999999999)==11
True

在您的情况下,错误发生在 tan 操作中,您的困惑是由于 print 试图使输出更具可读性的方式引起的:

>>> math.tan(math.radians(angle))
0.9999999999999999
>>> print(math.tan(math.radians(angle)))
1.0

最简单的解决方案是使用 round 而不是 int:

import math

angle = 45.0
tangent = math.tan(math.radians(angle))
n = 12*tangent
print "angle: ", angle
print "tangent: ", tangent
print "n: ", n
print "round(n,0): ", round(n,0)

产量:

angle:  45.0
tangent:  1.0
n:  12.0
round(n,0):  12.0

正如 ForceBru 提到的,有一个 Decimal 模块可以帮助进行浮点运算,但我发现它非常麻烦,通常在计算结束时四舍五入就足够了。