在600行的长代码中,我有一部分代码计算了一些奇怪的东西。
idl = 0
print type(dl), dl
idl = int(dl*10)+1
print idl
返回:
<type 'float'> 0.1
1
此计算在我的代码中的定义中完成。 这显然不是预期的结果。奇怪的是,当我将上面的代码复制到一个单独的python文件中时:
idl = 0
dl = 0.1
print type(dl), dl
idl = int(dl*10)+1
print idl
我明白了:
<type 'float'> 0.1
2
这个问题可能是什么原因?我已经提取了这些部分,以简化问题,但如果您愿意,我可以提供更多信息。
答案 0 :(得分:2)
Eric Postpischil的评论是关键的。
Python试图隐藏临时用户的一些丑陋的浮点数。大多数时候,没关系。有时,你会感到惊讶。许多十进制数字并不精确地以二进制形式表示 - 它们变成重复或非常长的分数。 Python的显示代码将二进制浮点数转换为小数,有时会四舍五入到正确的位置。
以下是关于该主题的可靠参考:http://docs.python.org/2/tutorial/floatingpoint.html
您提供的代码段是正确的,但您可能希望使用int(round(dl*10))
。
如果浮点数十进制数学的不精确表示导致你惊愕 - 例如,如果你正在使用金钱,那么请查看十进制模块:http://docs.python.org/2/library/decimal.html#module-decimal
十进制模块提供了很好的十进制数学设施,但使用它比浮点更麻烦。
对于它的价值,这个问题并不是Python独有的。您会在大多数编程语言中找到类似的问题(以及类似的十进制数学库来解决问题。)