이번 편의 목표: 나눗셈 종류와 연산 순서를 구분하고 금액을 계산합니다.
숫자가 나왔다고 계산이 맞는 것은 아닙니다. 예를 들어 일곱 개의 사과를 두 사람에게 똑같이 나누는 문제와, 7원을 2로 나누는 수학 계산은 원하는 답의 모양이 다릅니다. 파이썬에는 이 차이를 표현할 연산자가 있습니다.
나누기는 하나가 아니다
print(7 + 2)
print(7 - 2)
print(7 * 2)
print(7 / 2)
print(7 // 2)
print(7 % 2)
print(2 ** 3)
print(-7 // 2)
print(-7 % 2)
amount = 4500
amount += 500
print(amount)
count = 23
usable = (count // 5) * 5
print(usable)차례로 `9`, `5`, `14`, `3.5`, `3`, `1`, `8`, `-4`, `1`, `5000`, `20`이 출력됩니다. 일반적인 정수·실수 계산에서 `/`는 나눗셈 결과를 실수로 구합니다. `6 / 2`도 `3.0`입니다. `//`는 몫을 아래쪽 정수 방향으로 내리는 바닥 나눗셈입니다. 양수에서는 소수점을 버리는 것처럼 보이지만 음수에서는 다릅니다. `-3.5`를 아래로 내리면 `-4`입니다.
`%`는 나머지입니다. `a == (a // b) * b + (a % b)`의 관계를 떠올리면 음수 나눗셈도 확인할 수 있습니다. 단, `b`는 0이 아니어야 합니다. `/`, `//`, `%` 모두 0으로 나누면 오류가 납니다.
계산 순서를 드러내자
곱셈과 나눗셈은 덧셈과 뺄셈보다 먼저 계산합니다. `1000 + 2000 * 2`는 `5000`이고 `(1000 + 2000) * 2`는 `6000`입니다. 독자가 의도를 바로 알 수 있도록 필요한 괄호를 넣는 것이 좋습니다.
`amount += 500`은 여기서 `amount = amount + 500`처럼 작동합니다. 파이썬에는 C 계열의 증가 연산자 `amount++`가 없습니다. `++amount`는 증가가 아니라 단항 `+`를 두 번 적용한 표현으로 해석될 수 있으므로, 증가에는 `+= 1`을 사용합니다.
기존 글의 예처럼 `(count // 5) * 5`는 양수 개수를 5의 배수로 줄이는 계산입니다. 하지만 뒤쪽 데이터가 실제로 버려진다는 뜻도 됩니다. 수식의 결과뿐 아니라 버리는 데이터가 있어도 되는지 함께 판단해야 합니다.
소수 계산에서 놀라는 이유
`0.1 + 0.2`를 출력하면 `0.3`과 아주 조금 다른 값이 보일 수 있습니다. `float`가 많은 소수를 이진수로 정확하게 표현하지 못하기 때문입니다. 화면에 두 자리만 보이게 만드는 것과 내부 값을 정확하게 계산하는 것은 별개입니다.
이 연재의 지출 기록기는 금액을 원 단위 정수로 저장합니다. 소수 단위 금액을 정확하게 계산해야 하는 작업이라면 표준 라이브러리 `decimal` 등을 별도로 검토합니다. 우선 자료의 단위를 분명하게 정하는 습관을 들이세요.
직접 해 보기
사탕 `29`개를 한 봉지에 `6`개씩 담습니다. 완성되는 봉지 수와 남는 사탕 수를 각각 출력하세요. 봉지당 가격이 `2500`원일 때 판매 가능한 봉지의 총액도 구하세요.
해설
candies = 29
per_bag = 6
bags = candies // per_bag
remaining = candies % per_bag
print(bags)
print(remaining)
print(bags * 2500)결과는 `4`, `5`, `10000`입니다. 몫과 나머지를 구분하면 포장 수량, 페이지 수, 묶음 처리 같은 문제도 같은 방식으로 풀 수 있습니다.
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
등록된 댓글이 없습니다.