0

그것은 정확히 가까운 1> 1 만입니다 :python 비교 연산자가 작동하지 않는 경우, float (1)> float (1)이 True로 평가되면 무엇이 누락 되었습니까?

내가 두 타임 스탬프를 비교하고 if time > timestampTrue로 평가 무언가를하고 싶다. PDB에서 볼 수 있듯이 두 변수는, 그들에 같은 float

(Pdb) print time 
1396836917.98 
(Pdb) print last_timestamp 
1396836917.98 
(Pdb) if time > last_timestamp: print 'wtf' 
wtf 

나는이 False으로 평가하는 기대, float 문제가 될 것 같습니다 :

(Pdb) if float(time) > float(last_timestamp): print 'wtf' 
wtf 

int 비교가 잘 작동

(Pdb) if int(time) > int(last_timestamp): print 'wtf' 

그래서 사용 가능한 비트의 정밀도에 문제가있을 것으로 예상됩니다. 지금 내 주변에 수

(Pdb) if float(time)*100 > float(last_timestamp)*100: print 'wtf' 
wtf 

하지만 남아있는 소수 자릿수가없는 경우 여전히 True로 평가 ..

작품을 대표들

if int(time*100) > int(last_timestamp*100): print 'wtf' 

하지만 난 정말 좋겠 무슨 일이 일어나고 있는지 이해하고 float과 함께 > 연산자를 올바르게 사용하는 방법을 알고 싶습니다.

답변

3

파이썬을 사용하고 있습니까? print은 암시 적으로 str을 호출합니다. 이전 버전의 Python에서는 고유 한 부동 소수점 간의 차이를 숨길 수 있습니다. 대신 repr(time)repr(last_timestamp)을 인쇄 해보십시오. 부동 소수점이 다른 경우 repr은 서로 다른 문자열을 생성합니다.

+0

'파이썬 2.7의 결과를 제공

 select CONVERT(INTEGER, CONVERT(float, 4.1)-CONVERT(float, 0.1)) 

:

는 SQL 위해 당신은 같은 일을 설명 할 수 있습니다.5+ (기본값, Feb 27 2014, 19:37:08) linux2의 [GCC 4.8.1] 자세한 내용은 "help", "copyright", "credits"또는 "license"를 입력하십시오. repr()'shot을 사용했지만 타임 스탬프를 '문자열'로 모으므로 차이가 없어야합니다. – gletscher

+0

'repr'을 시도하십시오. 시간 소인이 어디서 왔는지는 중요하지 않습니다. –

0

이것은 부동 소수점 이해 문제와 같습니다.

기본적으로 특정 희소 숫자를 제외하고 부동 소수점 숫자는 숫자를 정확하게 저장하지 않으며,보고있는 것과 다른 작은 양의 숫자를 저장합니다. 예를 들어 (1-0.8! = 0.2). 여기

내가 자바에 대해 쓴 이메일입니다하지만 거의 모든 언어는 동일한 동작이 있습니다

정수를 절단으로 포인트 알고리즘을 떠 표준 IEE를 사용하여 Java (에서 (INT) (4.1-0.1)과 다른 것을 계산하는 시도 당신이 두 배로 변환하면

http://ideone.com/ZseOnZ

당신이 그 자체 완전히 다른를 얻을 수레하기 : 당신이 얻을 것이다 변환) 결과는 좀 더 예를 참조하십시오 3.

입니다 잘못된 값이지만 예를 들어 (int) (4.2f-0.2f) 잘못된 결과를줍니다. 이 3