2021.05.13 - [프로그래밍/Python] - [Python] round 함수 : 반올림 (1) - 사용 방법
2021.05.15 - [프로그래밍/Python] - [Python] round 함수 : 반올림 (2) - 예상과는 다른 결과
이전 포스팅에서는 우리가 알고 있는 반올림과는 다른 결과를 출력하는 파이썬의 round 함수에 대해서 알아봤습니다.
그런데 밑의 링크의 문제와 같이 파이썬의 round 함수에서 사용되는 오사오입 방식의 반올림이 아닌
우리가 일상생활에서 사용하는 사사오입 방식의 반올림 결과를 요구하는 문제들도 있습니다.
이번에는 우리가 알고 있는 반올림인 사사오입 방식의 반올림을 파이썬에서 구현하는 방법에 알아보겠습니다.
사사오입 방식의 반올림 구현 : decimal 모듈 사용
decimal 모듈은 정확한 십진법 산술을 위한 모듈입니다.
decimal 모듈의 context 객체에서 자리 올림 모드를 변경하여 사사오입 방식의 반올림을 사용할 수 있습니다.
밑의 링크는 decimal 모듈에 대한 파이썬 공식 문서 페이지입니다.
밑의 코드를 선언하면 decimal 모듈의 round 함수의 첫 번째 매개변수인 반올림을 할 숫자 매개변수에
Decimal 객체를 사용하여 숫자를 넣으면, 사사오입 방식의 반올림을 사용할 수 있습니다.
# decimal 모듈을 import합니다.
import decimal
# 산술 연산을 위한 환경을 불러옵니다.
context = decimal.getcontext()
# 반올림 방식을 사사오입 방식으로 변경해줍니다.
# 파이썬 기존의 반올림 방식인 오사오입 반올림은 decimal.ROUND_HALF_EVEN입니다.
context.rounding = decimal.ROUND_HALF_UP
※ 주의점!!! : round 함수의 매개변수가 하나일 때
round 함수에 매개변수를 하나만 넣으면 decimal 모듈을 써서
반올림 모드를 변경해도 사사오입 반올림이 적용되지 않습니다.
만약, 소수점 첫째 자리에서 반올림만을 고려해 round 함수에 하나의 매개변수만 사용할 생각이더라도
무조건 정밀도까지 표현하는 매개변수 2개인 round 함수를 사용해야합니다.
밑의 코드와 결과는 decimal 모듈을 사용하여 사사오입 방식의 반올림으로 설정한 후,
round 함수에 매개변수를 하나만 넣어본 결과입니다.
import decimal
# 사사오입 방식의 반올림을 사용하기 위해 설정해줍니다.
context = decimal.getcontext()
context.rounding = decimal.ROUND_HALF_UP
# 0.5의 소수점 첫째 자리에서 반올림하여 1이 나올 것으로 예상해봅니다.
# 그런데 0이 나옵니다.
print("0.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('0.5')))
# 1.5의 소수점 첫째 자리에서 반올림하여 2가 나올 것으로 예상해봅니다.
# 예상대로 2가 나옵니다.
print("1.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('1.5')))
# 2.5의 소수점 첫째 자리에서 반올림하여 3이 나올 것으로 예상해봅니다.
# 그런데 2가 나옵니다.
print("2.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('2.5')))
# 3.5의 소수점 첫째 자리에서 반올림하여 4가 나올 것으로 예상해봅니다.
# 예상대로 4가 나옵니다.
print("3.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('3.5')))
# 4.5의 소수점 첫째 자리에서 반올림하여 5가 나올 것으로 예상해봅니다.
# 그런데 4가 나옵니다.
print("4.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('4.5')))
print("\n---------------------------------------------------\n")
# -0.5의 소수점 첫째 자리에서 반올림하여 -1이 나올 것으로 예상해봅니다.
# 그런데 0이 나옵니다.
print("-0.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-0.5')))
# -1.5의 소수점 첫째 자리에서 반올림하여 -2가 나올 것으로 예상해봅니다.
# 예상대로 -2가 나옵니다.
print("-1.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-1.5')))
# -2.5의 소수점 첫째 자리에서 반올림하여 -3이 나올 것으로 예상해봅니다.
# 그런데 -2가 나옵니다.
print("-2.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-2.5')))
# -3.5의 소수점 첫째 자리에서 반올림하여 -4가 나올 것으로 예상해봅니다.
# 예상대로 -4가 나옵니다.
print("-3.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-3.5')))
# -4.5의 소수점 첫째 자리에서 반올림하여 -5가 나올 것으로 예상해봅니다.
# 그런데 -4가 나옵니다.
print("-4.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-4.5')))
round 함수의 매개변수가 두 개일 때
1. 양수
1-1. 양의 정수
밑의 코드와 결과는 양의 정수의 일의 자리에서 사사오입 반올림한 것입니다.
import decimal
# 사사오입 방식의 반올림을 사용하기 위해 설정해줍니다.
context = decimal.getcontext()
context.rounding = decimal.ROUND_HALF_UP
# 5의 일의 자리에서 사사오입 반올림하여 10이 나올 것으로 예상해봅니다.
# 예상대로 10이 나옵니다.
print("5의 일의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('5'), -1))
print("반환 형식:", type(round(decimal.Decimal('5'), -1)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('5'), -1))
print()
# 15의 일의 자리에서 사사오입 반올림하여 20이 나올 것으로 예상해봅니다.
# 예상대로 20이 나옵니다.
print("15의 일의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('15'), -1))
print("반환 형식:", type(round(decimal.Decimal('15'), -1)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('15'), -1))
print()
# 25의 일의 자리에서 사사오입 반올림하여 30이 나올 것으로 예상해봅니다.
# 예상대로 30이 나옵니다.
print("25의 일의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('25'), -1))
print("반환 형식:", type(round(decimal.Decimal('25'), -1)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('25'), -1))
print()
# 35의 일의 자리에서 사사오입 반올림하여 40이 나올 것으로 예상해봅니다.
# 예상대로 40이 나옵니다.
print("35의 일의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('35'), -1))
print("반환 형식:", type(round(decimal.Decimal('35'), -1)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('35'), -1))
print()
# 45의 일의 자리에서 사사오입 반올림하여 50이 나올 것으로 예상해봅니다.
# 예상대로 50이 나옵니다.
print("45의 일의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('45'), -1))
print("반환 형식:", type(round(decimal.Decimal('45'), -1)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('45'), -1))
밑의 코드와 결과는 양의 정수의 십의 자리에서 사사오입 반올림한 것입니다.
import decimal
# 사사오입 방식의 반올림을 사용하기 위해 설정해줍니다.
context = decimal.getcontext()
context.rounding = decimal.ROUND_HALF_UP
# 50의 십의 자리에서 사사오입 반올림하여 100이 나올 것으로 예상해봅니다.
# 예상대로 100이 나옵니다.
print("50의 십의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('50'), -2))
print("반환 형식:", type(round(decimal.Decimal('50'), -2)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('50'), -2))
print()
# 150의 십의 자리에서 사사오입 반올림하여 200이 나올 것으로 예상해봅니다.
# 예상대로 200이 나옵니다.
print("150의 십의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('150'), -2))
print("반환 형식:", type(round(decimal.Decimal('150'), -2)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('150'), -2))
print()
# 250의 십의 자리에서 사사오입 반올림하여 300이 나올 것으로 예상해봅니다.
# 예상대로 300이 나옵니다.
print("250의 십의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('250'), -2))
print("반환 형식:", type(round(decimal.Decimal('250'), -2)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('250'), -2))
print()
# 350의 십의 자리에서 사사오입 반올림하여 400이 나올 것으로 예상해봅니다.
# 예상대로 400이 나옵니다.
print("350의 십의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('350'), -2))
print("반환 형식:", type(round(decimal.Decimal('350'), -2)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('350'), -2))
print()
# 450의 십의 자리에서 사사오입 반올림하여 500이 나올 것으로 예상해봅니다.
# 예상대로 500이 나옵니다.
print("450의 십의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('450'), -2))
print("반환 형식:", type(round(decimal.Decimal('450'), -2)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('450'), -2))
1-2. 양의 소수
밑의 코드와 결과는 양의 소수의 소수점 첫째 자리에서 사사오입 반올림한 것입니다.
import decimal
# 사사오입 방식의 반올림을 사용하기 위해 설정해줍니다.
context = decimal.getcontext()
context.rounding = decimal.ROUND_HALF_UP
# 0.5의 소수점 첫째 자리에서 사사오입 반올림하여 1이 나올 것으로 예상해봅니다.
# 예상대로 1이 나옵니다.
print("0.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('0.5'), 0))
print("반환 형식:", type(round(decimal.Decimal('0.5'), 0)))
print()
# 1.5의 소수점 둘째 자리에서 사사오입 반올림하여 2가 나올 것으로 예상해봅니다.
# 예상대로 2가 나옵니다.
print("1.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('1.5'), 0))
print("반환 형식:", type(round(decimal.Decimal('1.5'), 0)))
print()
# 2.5의 소수점 첫째 자리에서 사사오입 반올림하여 3이 나올 것으로 예상해봅니다.
# 예상대로 3이 나옵니다.
print("2.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('2.5'), 0))
print("반환 형식:", type(round(decimal.Decimal('2.5'), 0)))
print()
# 3.5의 소수점 첫째 자리에서 사사오입 반올림하여 4가 나올 것으로 예상해봅니다.
# 예상대로 4가 나옵니다.
print("3.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('3.5'), 0))
print("반환 형식:", type(round(decimal.Decimal('3.5'), 0)))
print()
# 4.5의 소수점 첫째 자리에서 사사오입 반올림하여 5가 나올 것으로 예상해봅니다.
# 예상대로 5가 나옵니다.
print("4.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('4.5'), 0))
print("반환 형식:", type(round(decimal.Decimal('4.5'), 0)))
밑의 코드와 결과는 양의 소수의 소수점 둘째 자리에서 사사오입 반올림한 것입니다.
import decimal
# 사사오입 방식의 반올림을 사용하기 위해 설정해줍니다.
context = decimal.getcontext()
context.rounding = decimal.ROUND_HALF_UP
# 0.05의 소수점 둘째 자리에서 사사오입 반올림하여 0.1이 나올 것으로 예상해봅니다.
# 예상대로 0.1이 나옵니다.
print("0.05의 소수점 둘째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('0.05'), 1))
print("반환 형식:", type(round(decimal.Decimal('0.05'), 1)))
print()
# 0.15의 소수점 둘째 자리에서 사사오입 반올림하여 0.2가 나올 것으로 예상해봅니다.
# 예상대로 0.2가 나옵니다.
print("0.15의 소수점 둘째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('0.15'), 1))
print("반환 형식:", type(round(decimal.Decimal('0.15'), 1)))
print()
# 0.25의 소수점 둘째 자리에서 사사오입 반올림하여 0.3이 나올 것으로 예상해봅니다.
# 예상대로 0.3이 나옵니다.
print("0.25의 소수점 둘째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('0.25'), 1))
print("반환 형식:", type(round(decimal.Decimal('0.25'), 1)))
print()
# 0.35의 소수점 둘째 자리에서 사사오입 반올림하여 0.4가 나올 것으로 예상해봅니다.
# 예상대로 0.4가 나옵니다.
print("0.35의 소수점 둘째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('0.35'), 1))
print("반환 형식:", type(round(decimal.Decimal('0.35'), 1)))
print()
# 0.45의 소수점 둘째 자리에서 사사오입 반올림하여 0.5가 나올 것으로 예상해봅니다.
# 예상대로 0.5가 나옵니다.
print("0.45의 소수점 둘째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('0.45'), 1))
print("반환 형식:", type(round(decimal.Decimal('0.45'), 1)))
2. 음수
2-1. 음의 정수
밑의 코드와 결과는 음의 정수의 일의 자리에서 사사오입 반올림한 것입니다.
import decimal
# 사사오입 방식의 반올림을 사용하기 위해 설정해줍니다.
context = decimal.getcontext()
context.rounding = decimal.ROUND_HALF_UP
# -5의 일의 자리에서 사사오입 반올림하여 -10이 나올 것으로 예상해봅니다.
# 예상대로 -10이 나옵니다.
print("-5의 일의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-5'), -1))
print("반환 형식:", type(round(decimal.Decimal('-5'), -1)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('-5'), -1))
print()
# -15의 일의 자리에서 사사오입 반올림하여 -20이 나올 것으로 예상해봅니다.
# 예상대로 -20이 나옵니다.
print("-15의 일의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-15'), -1))
print("반환 형식:", type(round(decimal.Decimal('-15'), -1)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('-15'), -1))
print()
# -25의 일의 자리에서 사사오입 반올림하여 -30이 나올 것으로 예상해봅니다.
# 예상대로 -30이 나옵니다.
print("-25의 일의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-25'), -1))
print("반환 형식:", type(round(decimal.Decimal('-25'), -1)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('-25'), -1))
print()
# -35의 일의 자리에서 사사오입 반올림하여 -40이 나올 것으로 예상해봅니다.
# 예상대로 -40이 나옵니다.
print("-35의 일의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-35'), -1))
print("반환 형식:", type(round(decimal.Decimal('-35'), -1)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('-35'), -1))
print()
# -45의 일의 자리에서 사사오입 반올림하여 -50이 나올 것으로 예상해봅니다.
# 예상대로 -50이 나옵니다.
print("-45의 일의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-45'), -1))
print("반환 형식:", type(round(decimal.Decimal('-45'), -1)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('-45'), -1))
밑의 코드와 결과는 음의 정수의 십의 자리에서 사사오입 반올림한 것입니다.
import decimal
# 사사오입 방식의 반올림을 사용하기 위해 설정해줍니다.
context = decimal.getcontext()
context.rounding = decimal.ROUND_HALF_UP
# -50의 십의 자리에서 사사오입 반올림하여 -100이 나올 것으로 예상해봅니다.
# 예상대로 -100이 나옵니다.
print("-50의 십의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-50'), -2))
print("반환 형식:", type(round(decimal.Decimal('-50'), -2)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('-50'), -2))
print()
# -150의 십의 자리에서 사사오입 반올림하여 -200이 나올 것으로 예상해봅니다.
# 예상대로 -200이 나옵니다.
print("-150의 십의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-150'), -2))
print("반환 형식:", type(round(decimal.Decimal('-150'), -2)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('-150'), -2))
print()
# -250의 십의 자리에서 사사오입 반올림하여 -300이 나올 것으로 예상해봅니다.
# 예상대로 -300이 나옵니다.
print("-250의 십의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-250'), -2))
print("반환 형식:", type(round(decimal.Decimal('-250'), -2)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('-250'), -2))
print()
# -350의 십의 자리에서 사사오입 반올림하여 -400이 나올 것으로 예상해봅니다.
# 예상대로 -400이 나옵니다.
print("-350의 십의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-350'), -2))
print("반환 형식:", type(round(decimal.Decimal('-350'), -2)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('-350'), -2))
print()
# -450의 십의 자리에서 사사오입 반올림하여 -500이 나올 것으로 예상해봅니다.
# 예상대로 -500이 나옵니다.
print("-450의 십의 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-450'), -2))
print("반환 형식:", type(round(decimal.Decimal('-450'), -2)))
print("지수 표현없이 출력하기:", "%d" % round(decimal.Decimal('-450'), -2))
2-2. 음의 소수
밑의 코드와 결과는 음의 소수의 소수점 첫째 자리에서 사사오입 반올림한 것입니다.
import decimal
# 사사오입 방식의 반올림을 사용하기 위해 설정해줍니다.
context = decimal.getcontext()
context.rounding = decimal.ROUND_HALF_UP
# -0.5의 소수점 첫째 자리에서 사사오입 반올림하여 -1이 나올 것으로 예상해봅니다.
# 예상대로 -1이 나옵니다.
print("-0.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-0.5'), 0))
print("반환 형식:", type(round(decimal.Decimal('-0.5'), 0)))
print()
# -1.5의 소수점 첫째 자리에서 사사오입 반올림하여 -2가 나올 것으로 예상해봅니다.
# 예상대로 -2가 나옵니다.
print("-1.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-1.5'), 0))
print("반환 형식:", type(round(decimal.Decimal('-1.5'), 0)))
print()
# -2.5의 소수점 첫째 자리에서 사사오입 반올림하여 -3이 나올 것으로 예상해봅니다.
# 예상대로 -3이 나옵니다.
print("-2.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-2.5'), 0))
print("반환 형식:", type(round(decimal.Decimal('-2.5'), 0)))
print()
# -3.5의 소수점 첫째 자리에서 사사오입 반올림하여 -4가 나올 것으로 예상해봅니다.
# 예상대로 -4가 나옵니다.
print("-3.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-3.5'), 0))
print("반환 형식:", type(round(decimal.Decimal('-3.5'), 0)))
print()
# -4.5의 소수점 첫째 자리에서 사사오입 반올림하여 -5가 나올 것으로 예상해봅니다.
# 예상대로 -5가 나옵니다.
print("-4.5의 소수점 첫째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-4.5'), 0))
print("반환 형식:", type(round(decimal.Decimal('-4.5'), 0)))
밑의 코드와 결과는 음의 소수의 소수점 둘째 자리에서 사사오입 반올림한 것입니다.
import decimal
# 사사오입 방식의 반올림을 사용하기 위해 설정해줍니다.
context = decimal.getcontext()
context.rounding = decimal.ROUND_HALF_UP
# -0.05의 소수점 둘째 자리에서 사사오입 반올림하여 -0.1이 나올 것으로 예상해봅니다.
# 예상대로 -0.1이 나옵니다.
print("-0.05의 소수점 둘째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-0.05'), 1))
print("반환 형식:", type(round(decimal.Decimal('-0.05'), 1)))
print()
# -0.15의 소수점 둘째 자리에서 사사오입 반올림하여 -0.2가 나올 것으로 예상해봅니다.
# 예상대로 -0.2가 나옵니다.
print("-0.15의 소수점 둘째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-0.15'), 1))
print("반환 형식:", type(round(decimal.Decimal('-0.15'), 1)))
print()
# -0.25의 소수점 둘째 자리에서 사사오입 반올림하여 -0.3이 나올 것으로 예상해봅니다.
# 예상대로 -0.3이 나옵니다.
print("-0.25의 소수점 둘째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-0.25'), 1))
print("반환 형식:", type(round(decimal.Decimal('-0.25'), 1)))
print()
# -0.35의 소수점 둘째 자리에서 사사오입 반올림하여 -0.4가 나올 것으로 예상해봅니다.
# 예상대로 -0.4가 나옵니다.
print("-0.35의 소수점 둘째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-0.35'), 1))
print("반환 형식:", type(round(decimal.Decimal('-0.35'), 1)))
print()
# -0.45의 소수점 둘째 자리에서 사사오입 반올림하여 -0.5가 나올 것으로 예상해봅니다.
# 예상대로 -0.5가 나옵니다.
print("-0.45의 소수점 둘째 자리에서 사사오입 반올림한 결과:", round(decimal.Decimal('-0.45'), 1))
print("반환 형식:", type(round(decimal.Decimal('-0.45'), 1)))
댓글