我正在使用集成到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”
答案 0 :(得分:4)
如果您在代码中添加以下行,您将获得惊人的结果
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
模块来帮助浮点运算,但我发现它非常繁琐,并且在计算结束时舍入通常就足够了。