2013-05-16 134 views
0

在600行长码中,我有一部分代码计算奇怪的东西。Python计算:浮点数和整数

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 

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

+1

铸造到int不会绕过你的数字,而是截断它。正因为如此,你可以得到0.999999而不是1,所以当投射到int时它会给出0。我不确定为什么结果会在不同的地方有所不同,尽管...... – sashkello

+3

也许'dl'的值不像第一种情况那样接近.1,但是Python只打印它以限制精确。我建议你以更精确的方式打印它(我不熟悉Python语法),或者打印'dl-.1'来查看其差异。正如sashkello所指出的那样,如果'dl'略小于'.1',那么'dl * 10'略小于1,转换为'int'会将其截断为零。 –

回答

2

Eric Postpischil的评论是on-point。

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独有的。你会在大多数编程语言中发现类似的问题(和一个类似的十进制数学库来解决这个问题。)

+0

谢谢,这个答案确实帮助我,而且事实上也是这个问题。 –