2017-11-08 10 views
0

저는 여전히 Java를 연구 중이며이 변환기에 대한 연습을하고 있습니다. 나는 다음과 같이 무언가를 썼다. 광부 문제는 작은 소수 부분을 변환 할 때 보통 정밀도 문제가 발생합니다 (이해하므로 실제로 계산에 사용 된 분수를 인쇄합니다).Java Denary to Binary Converter 정밀 조언

  1. 제한이 사용자의 입력에서 소수 공간과 출력
  2. 출력
같이 부정확 한 결과를 : 나는 온라인 또는 앱 컨버터의 대부분은 다음과 같은 방법 중 하나를 사용하여이 문제를 다루고있는 것을 발견

약간의 정밀도 문제가있는 변환기를 사용할 때 사람들이이 문제에 대해 어떻게 생각하는지 알고 싶습니다. 전혀 문제가되지 않습니까? 그리고 어쨌든이 문제를 정말로 고칠 수 있습니까? 생각을 공유하십시오. 감사합니다 ^^

private static void DtoB() { 
    int power; 
    long i, integer; 
    double d, fraction, f; 
    System.out.println(); 
    System.out.print("Plese enter the denary number: "); 
    //Break the number 
    d = getDouble(); //method that gets the valid input form user 
    integer = Math.abs((long)d); 
    fraction = Math.abs(d - integer); 
    i = integer;  //store the original input for later use 
    f = fraction;  //store the original input for later use 
    power = 1; 

    System.out.println("Integer part: "+i); 
    System.out.println("Fraction part: "+f); 
    System.out.println(); 
    System.out.print("The binary form is: "); 

    //Convert the integer part 
    //get the largest power of 2 smaller than the number 
    while(integer != 0) { 
     while(power <= integer/2) { 
     power *= 2; 
     } 
     System.out.print("1"); 
     integer -= power; 
     //get the rest 1 & 0 till the smallest power of 2 
     while(power > 1) { 
      power /= 2; 
      if (integer < power) 
       System.out.print("0"); 
      else { 
       System.out.print("1"); 
       integer -= power; 
      } 
     } 
    } 
    //Convert the fraction part 
    if (fraction < 1.0){ //check if there is a fraction part needs to convert 
     System.out.print("."); 
     while (fraction < 1.0 && fraction != 0) { 
      fraction *= 2; 
      if (fraction > 1.0) { 
       System.out.print("1"); 
       fraction = (fraction - 1); 
      } 
      else { 
       System.out.print("0"); 
      } 
     } 
    } 
    else if (fraction == 0) { 
    } 
System.out.println(); 
} 

답변

0

당신이 받아들이는 것은 당신에게 달려 있습니다. 당신이 고객을 위해 이것을 쓰고 있었다면, 물론 당신은 그들에게 물어볼 것입니다.

부동 소수점 정밀도 문제를 방지하려면 부동 소수점 형식을 함께 사용하지 마십시오.

BigDecimal 클래스는 Java에서 임의 정밀도 연산을 수행하기 위해 존재합니다.

연구의 이유로 BigDecimal을 사용하고 싶지 않으면 유사한 기능을 직접 쓸 수 있습니다. 전화 번호로 문자열을 읽으십시오. .으로 분할하여 정수 부분과 소수 부분을 가져 와서 정수로 변환하십시오.

또한 소수부의 앞에 오는 0을 추적해야합니다. 그렇지 않으면 3.513.00051은 같은 것으로 평가됩니다. 따라서, 예를 들어 :

  • 3.51i==3, f==51, z==0
  • 42.0022에 구문 분석 이진에 i=42, f==22, z==2

변환에 구문 분석, 나는 연습으로 당신에게 맡긴다.

+0

조언을 주셔서 감사합니다. 저는 소수 부분을 두 개로 저장하므로 제로를 추적 할 필요가 없지만 정밀도 문제가 발생합니다. 그래서 만약 내가 문자열로 분수를 읽고 계산하기 전에 정수로 변환하면 더 정확한 결과를 얻을 수 있습니까? 나는 그것을 시도 할 것이다 :) – JoN