2013-06-20 5 views
3

밀리 초를 곱하여 30 일을 계산하려고 시도하지만 그 결과가 days_30 값의 음수가됩니다. 이유는 확실하지 않습니다. .1000 * 60 * 60 * 24 * 30의 결과는 음수입니다.

모든 의견을 매우 높이 평가합니다.

CODE 니펫 -1702967296

P.S. :에

// check to ensure proper time has elapsed 
       SharedPreferences pref = getApplicationContext() 
         .getSharedPreferences("DataCountService", 0); 
       long days_30 = 1000 * 60 * 60 * 24 * 30; 
       long oldTime = pref.getLong("smstimestamp", 0); 
       long newTime = System.currentTimeMillis(); 
       if(newTime - oldTime >= days_30){ 

days_30 값 결과

double days_30 = 1000 * 60 * 60 * 24 * 30; 
       double oldTime = pref.getLong("smstimestamp", 0); 
       double newTime = System.currentTimeMillis(); 
       if(newTime - oldTime >= days_30){ 

결과는 작지만 여전히 음수입니다. -1.702967296E9

+1

체크 아웃 [이 게시물] (http://stackoverflow.com/a/12758352/1679863) –

답변

18

당신은 함께 ints를 곱하여하고 있으며, 오버 플로우 때문에 the maximum integer is 2^31 - 1 발생합니다. 곱셈 후에 만 ​​long으로 변환됩니다. 첫 번째 숫자는 long으로 전송하십시오.

long days_30 = (long) 1000 * 60 * 60 * 24 * 30; 

또는 사용하십시오 long 문자 : 시작부터 long 수학 연산을 강제

long days_30 = 1000L * 60 * 60 * 24 * 30; 

. 이 기본 데이터 형에 관해서

+0

당신에게 선생님 감사합니다! - Amani Swann – NoobDev954

2
long days_30 = 1L * 1000 * 60 * 60 * 24 * 30; 
1

그냥 자바는 한계가있다 long days_30 = 1000L * 60 * 60 * 24 * 30;

0

에 곱셈을 변경합니다. 너의 long 또는 double이 너무 크면 음수로 오버 플로우 될 것이다. 더 큰 숫자를 저장하기 위해 BigInteger 클래스를 사용해보십시오.

확인이 아웃 :

How does Java handle integer underflows and overflows and how would you check for it?

+0

이 경우에 '길다'는 충분하다. –

+0

"컴퓨터는 숫자에 관한 제한 사항"이 있으면 BigInteger가 어떻게 도움이 될까요? –

+0

'double '이 범위를 넘으면'POSITIVE_INFINITY' (또는'NEGATIVE_INFINITY') 결과가 오버 플로우가 아닙니다. – rgettman

관련 문제