[Java]분수를 소수점 20째자리까지 출력하는 방법

두 자연수 a,b를 입력받아 a/b를 소수점 20째자리까지 출력하라고 한다면 어떻게 해야할까?

 

일단 생각할 수 있는 방법은 %.20f 로 a/b를 출력하는 것이다.

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int a=sc.nextInt();
        int b=sc.nextInt();
        System.out.printf("%.20f",(double)a/b);
    }
}

 

근데 이렇게 하면 정답이 아니다

 

 

왜 이런 문제가 발생하냐면 자바에서 float 타입은 소수점 아래 9째자리까지 표현할 수 있고

 

double 타입은 18째자리까지만 표현할 수 있다.

 

그러면 어떻게 해야하는가? 실제로 하나하나 계산해보는 수밖에 없다

 

7/8을 계산할 때 생각해보면.. 먼저 7을 8로 나눈 몫은 0이고 나머지는 7이다.

 

 

그리고 우리는 나머지 부분 7에 10을 곱해주고.. 몫 0부분에 소수점 .을 표시해준다

 

 

그리고 70을 8로 나눈 몫을 소수점 뒤에 써주고, 나머지는 아래에 내려준다

 

 

그리고 나머지 6에 다시 10을 곱하고.. 그리고 다시 8로 나눈 몫을 소수점 뒤에 써주고 나머지는 내려준다

 

 

 

다시 나머지 4에 10을 곱해주고... 40을 8로 나눈 몫을 소수점 뒤에 써주고.. 나머지를 아래에 내려준다

 

 

나머지가 0이니까 계산 끝

 

그래서 알고리즘을 정리하면 다음과 같다

 

1) 정수부분은 a를 b로 나눈 몫이다.

 

2) 1)에서 계산한 나머지에 10을 곱해 b로 나눠준 몫이 다음 소수 1째자리이다.

 

3) 2)에서 계산한 나머지에 10을 곱해 b로 나눠준 몫이 소수 2째자리이다.

 

4) 3)에서 계산한 나머지에 10을 곱해 b로 나눠준 몫이 소수 3째자리이다.

 

...

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 여기에 코드를 작성해주세요.

        Scanner sc = new Scanner(System.in);

        int a = sc.nextInt();
        int b = sc.nextInt();

        int i = 1;
        
        //정수부분을 구한다.
        System.out.print(a/b+".");
        a = a%b;
        
        //나머지에 10을 곱하고 계산한 몫이 다음 소수 자리이다.
        //나머지에 10을 곱하고 계산한 나머지를 a로 갱신한다.
        //20번 수행하면 소수 20째자리까지 구할 수 있다.
        while (i <= 20) {

            System.out.print((a*10)/b);
            a = (a*10)%b;
            i += 1;
        }
    }
}
TAGS.

Comments