실전 오류 해결 팁/Python

[Python] 소수점 자릿수 제한법

이우열 2023. 4. 14. 14:19
728x90

알고리즘 문제를 풀거나, 혹은 할인된 가격 등을 계산할 때 정수가 아닌 실수 형태로 나타나는 경우가 있다.

이럴 때 가끔 자릿수를 제한하여 소수점 이하 첫째 자리, 둘째 자리 등등 조건이 붙게 된다.

 

이를 위해 Python에서 소수점 자릿수를 제한하여 출력하는 방법에 대해 알아봅시다.

 

✅ round 함수 사용

round 함수는 round(x)와 같은 형태로 x의 값을 반올림하는데 사용합니다.

 

추가로 round 함수는 두 번째 인자를 갖을 수 있고

round(x, 3)이라는 형태를 가질 경우 넷째 자리에서 반올림하여 소수점 이하 셋째 자리까지 출력하게 됩니다.

 

a = 1.23456

print(round(a, 0))
# 1.0

print(round(a, 1))
# 1.2

print(round(a, 2))
# 1.23

 


 

✅ format 서식 지정

 

파이썬에서 format 함수를 사용하면 문자열 사이에서 변수를 사용할 수 있습니다.

"abcd{0}dcba".format(x)"

 

이 때, 괄호 안에 {:.2f}와 같이 콜론 점 숫자 f를 입력하면 작성한 숫자만큼의 소수 자릿수를 가진 반올림된 수로 출력됩니다.

print("ex1 : {:.2f}".format(1.23456))
# ex1 : 1.23

print("ex2 : {:.2f} / {:.3f}".format(1.23456, 3.456789))
# ex2 : 1.23 / 3.457

print("ex3 : {0:.2f} / {1:.1f}".format(3.2251, 10.123456))
# ex3 : 3.23 / 10.1

print("ex4 : {1:.2f} / {0:.1f}".format(3.2251, 10.123456))
# ex4 : 10.12 / 3.2

 


 

✅ f-string 사용

 

f-string 방식도 format 함수의 방식과 동일하게

{x:.2f}와 같이 변수 뒤에 콜론 점 숫자 f를 사용하여 출력할 수 있습니다.

 

a = 1.23456

print(f"ex1 : {a:.0f}")
# ex1 : 1

print(f"ex2 : {a:.1f}")
# ex2 : 1.2

print(f"ex3 : {a:.3f}")
# ex3 : 1.235

 


 

🚨 주의점!!!

 

프로그래밍 언어에서는 실수를 연산할 때 오차가 생기게 된다.

오차가 생기는 이유는 컴퓨터가 숫자를 2진수로 받아들이기 때문이다.

 

0.3을 2진수로 표현한다면 0.3 = 0.01001100110011...(2) 이와 같이 무한한 수가 되기 때문이다.

결국 컴퓨터는 근사치를 저장하게 되는데 여기서 오차가 발생하게 되는 것이다.

 


 

근사치를 저장할 때 고정 소수점과 부동 소수점 2가지 방식을 사용해서 저장하는데

 

고정 소수점 방식을 사용하면 메모리의 한계(저장할 수 있는 메모리가 정해져 있는 방식)로 인해 오차가 커지게 된다.

 

만약 32bit로 실수를 표현한다면

0(부호) 000 0000 0000 0000 (정수) . 0000 0000 0000 0000 (소수) (2)와 같은 형태로 저장하는 것이다.


 

부동 소수점 방식은 IEEE에서 표준으로 정한 방법으로 부호부, 지수부, 가수부로 나누어 저장하는 방식이다.

 

  • 부호부는 부호를 나타낸다. 양수는 0 음수는 1
  • 지수부는 0.01001100110011과 같은 소수를 1과 2 사이의 수와 지수의 곱으로 나타낸 뒤 생기는 지수를 저장한다.
    • 즉, 1.001100110011 × 2^(-2) 가 되고 지수부에는 -2가 저장된다
  • 가수부는 남은 소수점을 저장한다.

 

하지만 위와 같은 두 가지의 방식 모두 근사치를 저장하기 때문에 오차가 발생할 수 밖에 없다.

이를 극복하기 위해서는 Python의 decimal 모듈 fractions 모듈 같은 방식을 사용하거나 최소한의 오차를 줄일 수 있는 작은 수를 더하여 사용해야 한다.

 

✏️ decimal 모듈과 fractions 모듈 사용법

 

https://0.30000000000000004.com/#python-3

 

Floating Point Math

Floating Point Math Your language isn’t broken, it’s doing floating point math. Computers can only natively store integers, so they need some way of representing decimal numbers. This representation is not perfectly accurate. This is why, more often th

0.30000000000000004.com

 

728x90

'실전 오류 해결 팁 > Python' 카테고리의 다른 글

[Python] 패킹과 언패킹  (0) 2023.04.11