2014-09-24 3 views
1

Stringlong으로 변환하는 Java 코드를 작성했습니다. 그러나 오버 플로우 문제를 해결할 때이를 해결하는 방법에 대한 단서가 없습니다. 넘버가 넘치면 컴퓨터는 모든 수를 합법적이라고 생각합니다. 64bit JDK와 함께 프로그램이 넘치도록하는 방법은 키 문제입니다. 그리고 parseLong이나 다른 라이브러리와 같은 내장 라이브러리를 사용할 수 없습니다. 데이터보다 큰 long.maxvalue이다문자열을 Long으로 변환, 라이브러리에 내장하지 않음

public static long strTolong(String s){ 
     //error checking 
     if(s == null) return 0; 
     s = s.trim();//remove all space character 
     boolean neg = false;//judge the number is negative or positive 
     int pos = 0 ; //index of string 
     long result = 0; 
     //check positive or negative 
     if(s.charAt(pos) == '-'){ 
      neg = true; 
      pos++; 
     }else if(s.charAt(pos) == '+') pos++; 

     //calculate result 
     while(pos<s.length()){ 
      if(s.charAt(pos) >='0' && s.charAt(pos) <='9'){ 
       result = result*10+(s.charAt(pos) - '0'); 
      }else 
       break; 
      pos++; 
     } 
     if(neg) result =-result; 

     //check overflow 
     if(result >Long.MAX_VALUE) { 
      return Long.MAX_VALUE; 
     } 
     if(result<Long.MIN_VALUE){ 
      return Long.MIN_VALUE; 
     } 


     return result; 
    } 

경우, 결과는 정확하게 컴퓨터에 저장 될 수 없다.

이 문제를 해결하는 방법은 무엇입니까?

+3

'Long.parseLong ("102");의 문제점은 무엇입니까? –

답변

1

당신의 최선의 옵션은 입력 및 최소 사이의 사전적인 비교를 할 아마도/최대 숫자는 당신이 시작하기 전에. 여기에 테스트

if (compare(s, ""+Long.MIN_VALUE) == -1) 
    throw new NumberFormatException("Input too small"); 

if (compare(s, ""+Long.MAX_VALUE) == 1) 
    throw new NumberFormatException("Input too large"); 

: 코드가 입력이 잘 형성되어 있는지 확인하지 않습니다 http://ideone.com/HmMkJ3

참고를 다음과 같이

static int compare(String v1, String v2) { 
    boolean neg1 = v1.startsWith("-"); 
    boolean neg2 = v2.startsWith("-"); 
    return neg1 ? (neg2 ? -comparePositives(v1.substring(1),v2.substring(1)):-1) 
       : (neg2 ? 1 : comparePositives(v1, v2)); 
} 

static int comparePositives(String v1, String v2) { 
    // Is one longer? 
    if (v1.length() != v2.length()) 
     return v1.length() < v2.length() ? -1 : 1; 

    // Both empty? 
    if (v1.isEmpty()) 
     return 0; 

    // First digit differs? 
    if (v1.charAt(0) != v2.charAt(0)) 
     return v1.charAt(0) < v2.charAt(0) ? -1 : 1; 

    // Recurse on rest of number 
    return comparePositives(v1.substring(1), v2.substring(1)); 
} 

는 예를 들어 사용합니다. 나는 당신이 그런 수표를 첫째로하는 것이 좋습니다. 0-0 등의 사례를 알고 있어야합니다.

+0

당신의 해결책은 인상적입니다. 그러나 내장 라이브러리가 여기에 사용됩니다. 그리고 정규 표현 방식도 그렇습니다. –

+0

중요한 문제는 컴퓨터가 데이터가 넘쳐 흐르지 않는다는 것입니다. –

+0

답변이 업데이트되었습니다. – aioobe

0

당신은 긴 #으로 parseLong 할 것 같은 일을 할 수있는 :

throw new NumberFormatException("too long (pun intended): "+s); 
+0

컴퓨터가 데이터가 넘치고 있다는 것을 알 수 없다는 문제가 있습니다. –

0

여기에서 성취하려는 것이 확실하지 않습니다. StringLong.MAX_VALUE보다 큰 경우 더 이상 Long 값이 아님을 의미합니다.

String 값이 Long의 범위에있는 경우 Long.parseLong()을 사용하면 이러한 종류의 어려운 방법을 사용할 수 있습니다. 당신은 엄청난 수의를 갖고 싶어

당신이 BigDecimal을 사용할 수 있습니다 쉽게

String max = Long.MAX_VALUE+""; 
System.out.println(max); 
long maxL=Long.parseLong(max)+1; 
System.out.println(maxL); 
BigDecimal bigDecimal=new BigDecimal(max).add(new BigDecimal("1")); 
System.out.println(bigDecimal); 

아웃 넣어 : 값보다보다 큰 Long.MAX_VALUE거나 낮은 경우

9223372036854775807 // long max value 
-9223372036854775808 // incorrect result in long 
9223372036854775808 // BigDecimal gives you correct one 

을 할 수있는 사건의 경우는 예외를 throw Long.MIN_VALUE

+0

코드에서 "// overflow"를 확인하십시오. – aioobe

+0

@aioobe 당신이하는 말은 무엇입니까? –

+0

* "String이 Long.MAX_VALUE보다 길면 더 이상 Long 값이 아닙니다."* - OP가 이것을 알고 있다고 확신합니다.그가 직면 한 문제는'result> Long이기 때문에'result> Long.MAX_VALUE'을 수행하여 오버 플로우를 검사 할 수 없다는 것입니다. – aioobe