0

在 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

这个问题的根源可能是什么?我已经提取了这些部分,以使问题变得简单,但是如果您愿意,我可以提供更多信息。

4

1 回答 1

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-十进制

十进制模块为进行十进制数学提供了极好的工具,但使用起来比浮点数更麻烦。

值得一提的是,这个问题并不是 Python 独有的。您会在大多数编程语言中发现类似的问题(以及类似的十进制数学库来解决这些问题。)

于 2013-05-16T04:01:21.903 回答