浮点到整数转换在Python中表现得非常奇怪

时间:2017-08-25 17:04:07

标签: python debugging floating-point integer type-conversion

所以这只是浪费了我几个小时的调试......

a,b = 32980.642295,32630.642295
print a-b
print int(a-b)
print int(a) - int(b)

输出:

350.0
349
350

有人可以向我解释发生了什么事吗?为什么350.0的int不会是350?我假设python在转换为int之前在转换a和b时做了一些奇怪的事情。

编辑/更新:

x = a-b

存储在x中的值现在是349.99999999999636而不是350.0

这可能有助于未来的人来Is floating point math broken?

4 个答案:

答案 0 :(得分:3)

print隐含地将str()应用于要求打印的内容,并在Python 2 str(some_float)中将其有效地应用于12位有效数字。 repr(some_float)轮到17:

>>> a,b = 32980.642295,32630.642295
>>> print str(a-b)
350.0
>>> print repr(a-b)
349.99999999999636

这就是原因。 a-b实际上不到350。

在Python 3中,str(some_float)repr(some_float)都生成最短的字符串s,使eval(s) == some_float

# Python 3 here, not Python 2
>>> a,b = 32980.642295,32630.642295
>>> print(str(a-b))
349.99999999999636
>>> print(repr(a-b))
349.99999999999636
>>> eval(str(a-b)) == a-b
True

答案 1 :(得分:2)

print轮次比你在Python 2上预期的更激烈。a-b略低于350; print将此数字舍入为350,但int将数字截断为349。

答案 2 :(得分:0)

好吧,我的理解是,在第一种情况下你的结果是浮点数,这意味着它打印了.0;

在第二种情况下,它使用浮点数进行减法运算,然后将其舍入为最接近的整数;

在第三种情况下,它将两个值四舍五入到最接近的integet,而不是减法;

希望它有用

答案 3 :(得分:0)

浮动数学没有被打破。由于转换为(机器内部)二进制表示,根据内部数字格式的大小引入了小错误。这就是我们根据十进制数计算结果小于350的原因。

在第一行中,舍入为350,在第二行中,int()只是截断为349.

第三行表现不同,偶然传递结果350,因为截断会同时改变两个值。