所以这只是浪费了我几个小时的调试......
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?
答案 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,因为截断会同时改变两个值。