2017-08-25 41 views
1

所以这只是浪费一对夫妇在调试矿井小时..浮点数到整数转换在Python行事怪异超级

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之前铸造和b ..

编辑/更新:

x = a-b 

值存储在X现在349.99999999999636不350.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 
+0

我搜索了一下,发现了什么(我认为)是问题。它不是我的打印版本,因为我将值存储在变量中并稍后访问它,但它处理浮点数学的方式。我只是在这里用例子来说明我的坏处。 这有助于我的理解https://stackoverflow.com/questions/588004/is-floating-point-math-broken# 如果我使x = ab,然后检查x,它会给我349.99999999999636 –

+2

它使得没有不管你直接使用'ab'还是将它存储在一个变量中,都是不同的。计算出的值完全相同。你的输出为'350.0'的原因已经解释过了:在Python 2中'print'将显示值显示为12位有效数字。无论您是“打印a-b”还是“打印x”,无所谓。 –

0

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

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

在第三种情况下,它将两个值四舍五入到最近的integet,并且比减法;

希望这是有益的

2

print轮花车更积极地比你想象的Python的2 a-b非常略高于350低; print这轮至350,但int截断到349的数量

0

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

在该结果为四舍五入至350,在第二行中的int()只是截断到349

第三行具有不同的行为和偶然将结果350的第一行,因为截断变化两个值都在同一个方向。