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
模块可以帮助进行浮点运算,但我发现它非常麻烦,通常在计算结束时四舍五入就足够了。
我正在使用集成到 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
模块可以帮助进行浮点运算,但我发现它非常麻烦,通常在计算结束时四舍五入就足够了。