{ }codelper

배우기 › Java

기초 · 04

계산과 나눗셈

더하기·빼기·곱하기는 같지만, 나눗셈은 언어마다 달라요.

+ - *는 어느 언어에서나 같지만, 나눗셈과 나머지(%)는 언어마다 달라요.
아래 예제는 두 수로 더하기·빼기·곱하기·몫·나머지·소수 나눗셈을 차례로 찍어요.

import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int a = sc.nextInt(), b = sc.nextInt();        System.out.println(a + b);        System.out.println(a - b);        System.out.println(a * b);        System.out.println(a / b);        System.out.println(a % b);        System.out.println((double) a / b);    }}
stdin
7 2
stdout
9
5
14
3
1
3.5

핵심

  • 정수끼리 나누면 정수가 되는 언어가 있어요: 7 / 2 → 3(소수 부분을 버려요).
    수가 한 종류인 언어는 바로 3.5예요.
  • 소수 결과가 필요하면 나누기 전에 한쪽을 실수로 바꿔요.
  • 음수를 나누면 언어가 두 편으로 갈려요.
    0 쪽으로 버리는 편(-3.5 → -3)과 내림하는 편(-3.5 → -4)이에요.
  • 정수에는 한계가 있어요.
    넘치면(overflow) 오류 없이 엉뚱한 값이 되기도 해요.
  • 0으로 나누면 오류로 멈추는 언어도 있고, 조용히 Infinity를 주는 언어도 있어요.

언어별로 쓰는 법

Python//는 몫(7 // 2 → 3), /는 늘 소수(7 / 2 → 3.5, 6 / 2도 3.0).
음수는 내림이에요.
정수는 넘치지 않아요.
0으로 나누면 ZeroDivisionError
JavaScript수가 한 종류라 7 / 2 → 3.5.
몫은 Math.trunc(a / b).
Math.floor는 음수에서 달라요(Math.floor(-3.5) → -4).
2^53을 넘으면 끝자리가 틀려져요(9007199254740993 → 9007199254740992).
0으로 나누면 Infinity
TypeScriptJavaScript와 같아요
Java정수 ÷ 정수는 정수, 소수는 (double)a / b → 3.5.
0 쪽으로 버려요.
int가 넘치면 오류 없이 돌아 넘어가요.
큰 수는 long.
정수를 0으로 나누면 ArithmeticException
C#Java와 같아요.
정수를 0으로 나누면 DivideByZeroException
C++정수 ÷ 정수는 정수, 소수는 (double)a / b.
0 쪽으로 버려요.
부호 있는 정수가 넘치거나 0으로 나누면 정의되지 않은 동작이에요.
큰 수는 long long
CC++와 같아요
Craykon수가 한 종류라 7 / 2 → 3.5.
몫은 수학.몫(a, b), 내림은 수학.내림.
%는 0 쪽으로 버려요.
2^53을 넘으면 끝자리가 틀려지고, 0으로 나누면 Infinity

자주 하는 실수

나눈 뒤에 실수로 바꿨어요Java · C# · C · C++

int a = 7, b = 2;
double d = (double)(a / b);

→ 3.0 — 괄호 안에서 정수 나눗셈이 먼저 끝나요

나누기 전에 바꿔요: (double)a / b → 3.5.

x % 2 == 1로 홀수를 찾았어요Java · C# · C · C++ · JavaScript · TypeScript · Craykon

int x = -3;
printf("%d\n", x % 2);

→ -1 — 그래서 x % 2 == 1은 거짓이 되어 음수 홀수를 놓쳐요

x % 2 != 0으로 써요.
어느 언어에서나 안전해요.

int가 넘쳤어요Java · C# · C · C++

int x = 2147483647;
x = x + 1;

→ Java·C#은 오류 없이 -2147483648. C·C++는 정의되지 않은 동작이에요

큰 수는 long(C·C++는 long long)을 써요.

언어마다 다른 점
음수 나눗셈은 언어마다 달라요.
Python은 -7 // 2 → -4, -7 % 2 → 1(내림)이고, C·C++·Java·C#·JavaScript(Math.trunc)·크레이콘(수학.몫)은 몫 -3, 나머지 -1(0 쪽으로 버림)이에요.

연습 문제