Python float和int行为

时间:2015-08-17 14:09:32

标签: python floating-point-conversion

当我尝试检查浮点变量是否包含完全整数值时,我得到了下面的奇怪行为。 我的代码:

$('body a').click(function(e){
		e.preventDefault();
		var goTo = $(this).attr('href').replace('#','');
		$("html, body").animate({
			scrollTop:$('a[name="'+goTo+'"]').offset().top
		},1100);
		
		window.location.hash = "#"+goTo;
		
	});

我得到了下面的奇怪输出(最后一行是问题):

x = 1.7  print x,  (x == int(x))   
x += 0.1  print x,  (x == int(x))
x += 0.1  print x,  (x == int(x))
x += 0.1  print x,  (x == int(x))
print "----------------------"

x = **2.7** print x,  (x == int(x))
x += 0.1  print x,  (x == int(x))
x += 0.1  print x,  (x == int(x))
x += 0.1  print x,  (x == int(x))

任何想法1.7 False 1.8 False 1.9 False 2.0 True ---------------------- 2.7 False 2.8 False 2.9 False 3.0 False 2.0true的原因是3.0

1 个答案:

答案 0 :(得分:10)

问题不在于转化,而在于添加

int(3.0) == 3.0

返回 True

正如所料。

问题是浮点数不是无限精确的,你不能指望2.7 + 0.1 * 3是3.0

>>> 2.7 + 0.1 + 0.1 + 0.1
3.0000000000000004
>>> 2.7 + 0.1 + 0.1 + 0.1 == 3.0
False

正如@SuperBiasedMan所建议的,值得注意的是,在OPs方法中,由于使用了简化数据表示以最大限度提高可读性的打印(字符串转换),问题在某种程度上被隐藏了

>>> print 2.7 + 0.1 + 0.1 + 0.1 
3.0
>>> str(2.7 + 0.1 + 0.1 + 0.1)
'3.0'
>>> repr(2.7 + 0.1 + 0.1 + 0.1)
'3.0000000000000004'