a를 b로 나눈 몫과 나머지를 함께 구합니다. 몫과 나머지 사이에는 a = b × 몫 + 나머지 관계가 항상 성립하므로, 결과가 의심되면 이 식으로 바로 검산할 수 있습니다.
음수에서 언어마다 답이 갈린다
양수끼리는 어느 방식이든 결과가 같습니다. 문제는 음수입니다. -17을 5로 나눈 나머지가 -2인지 3인지는 몫을 어느 방향으로 버리느냐에 달려 있고, 이 규칙이 언어마다 다릅니다.
| 방식 | 몫의 반올림 방향 | 나머지 부호 | -17÷5 나머지 |
|---|---|---|---|
| JavaScript · Java · C/C++ | 0을 향해 자름(truncate) | 피제수(왼쪽 값)와 같음 | -2 |
| Python (%) | 음의 무한대로 내림(floor) | 제수(오른쪽 값)와 같음 | 3 |
| 수학적 정의(모듈러 연산) | 나머지가 항상 0 이상이 되도록 | 항상 양수 (0 이상, 제수 절댓값 미만) | 3 |
같은 코드를 다른 언어로 옮길 때 이 차이 때문에 조용히 결과가 바뀌는 일이 생깁니다. 배열 인덱스를 순환시키거나 요일을 계산하는 코드라면 음수 입력에서 한 칸씩 어긋납니다.
사례
17을 5로 나누면 몫 3, 나머지 2입니다. 검산하면 5 × 3 + 2 = 17로 맞습니다.
요일 계산처럼 항상 0 이상의 나머지가 필요하다면 수학적 정의(모듈러) 방식을 고르면 됩니다. -17을 5로 나눈 결과가 3이 되어, 그대로 요일 배열의 인덱스로 쓸 수 있습니다.
0으로는 나눌 수 없다
제수가 0이면 몫 자체가 정의되지 않아 나머지도 존재하지 않습니다. 계산기는 이 경우 결과 대신 안내를 표시합니다.