Python整数意外结果

时间:2015-05-19 11:02:27

标签: python integer ironpython

我正在使用集成到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()函数返回11而非12。 我知道有一些浮点数问题,但这不应该与整数有关? 有谁知道为什么会这样?

感谢您的回复。

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

2 个答案:

答案 0 :(得分:4)

你有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

答案 1 :(得分:1)

在您的情况下,错误发生在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模块来帮助浮点运算,但我发现它非常繁琐,并且在计算结束时舍入通常就足够了。