두 자연수 a,b를 입력받아 a/b 결과를 소수점 20째자리까지 출력하는 프로그램을 작성해보세요.
예제1 | 예제2 |
---|---|
입력: 3 5 | 입력: 3 7 |
출력: 0.60000000000000000000 | 출력: 0.42857142857142857142 |
/
를 이용한 해결 ❌
/
를 사용해서 계산하면, 나와야하는 출력값과 다르다는 것을 알 수 있다.a, b = 3, 5 print(f"{a/b:.20f}") // 0.59999999999999997780
일반적으로 컴퓨터 시스템은 유한한 메모리를 가지고 있으며, 부동 소수점 연산은 이진수로 표현되기 때문에 정확한 10진수 표현은 제한된다. 이로 인해 매우 작거나 큰 수의 경우에는 유효 숫자를 제한하여 근사치로 표현하게 된다.
3/5는 정확히 0.6이다. 하지만 소수점 20자리까지 표현하려고 하면 컴퓨터에서 근사치로 나타낼 수밖에 없다.
a
를b
로 나눈 나머지에 10을 곱한 값을b
로 나눴을 때의 몫을 순서대로 적는 것을 계속 반복한다.a, b = 3, 5 # 정수 부분을 먼저 출력합니다. print(f"{a//b}.", end="") # a를 b로 나눈 나머지를 시작으로 # 소수점 자리를 하나씩 계산합니다. a %= b for _ in range(20): # 나머지에 10 곱한 값을 기준으로 # b로 나누었을 떄의 몫을 구해줍니다. a *= 10 print(a // b, end="") # a를 b로 나눈 나머지를 게속 갱신해줍니다. a %= b // 0.60000000000000000000
와우 저도 이 문제 푸는데 막혔는데 해결법 정리해주셔서 감사합니다 ^^