[java] 자바 primitive type

산술연산

  • 자바 산술 연산에서의 몇가지 예외적인 부분에 대해서 정리해본다.

오버플로우

  • int 정수형의 최대값은 약 2억이다. int 는 4바이트로 32비트이므로, -2^31 ~ (2^31 - 1) 범위를 갖는다. 아래 코드에서는 2억을 넘어가 예상과 다른 값이 나오는데, 이때는 long 타입을 사용해야 한다.
public static void overflow() {
		int x = 50000;
		int y = 50000;
		System.out.println(x*y);
	}

부동소수점

  • 부동소수점 타입(float, double) 은 0.1을 제대로 표현하지 못해 예상과 다른 결과가 나올수 있다.
public static void floatingPoint() {
		int x = 1;
		double y = 0.1;
		int z = 7;
		System.out.println(x - y * z);
	}

 //결과 0.299999 

숫자타입 변환

  • 자바는 숫자 연산시 변환이 일어난다.
  • 피연산자중 하나가 double 타입이면, double 로 변환하고 한쪽이 long 타입이면 다른 하나를 long 타입으로 변환한다. 그외에는 int 로 변환한다.
  • 예를 들어 ‘J’ + 1 은, ‘J’가 int 값 74로 변환되면서 75가 되고,, 75를 다시 char 로 변환하면 ‘K’ 가 된다.J는 아스키코드표에서 16진수 0x4A와 매핑된다. 4A를 2진수로 변환하면, 0100 1010 이다. 이걸 다시 10진수로 변환하면 74가 된다.
public static void convert() {
		char a = 'J';
		int b = 1;
		System.out.println((char)(a + b));
	}

큰 숫자 연산

  • 기본 정수 타입 또는 부동소수점 타입 연산의 정밀도가 충분하지 않을때는 BigInteger 나 BigDecimal 을 사용한다. 보통 금액 계산등 오차를 허용하지 않고 정확한 수치를 요구하는 경우에는 BigDecimal 을 이용하면 된다.

  • 자주 사용되지 않는 부분이므로, 필요할때마나 구글링 통해서 확인해도 될듯하다.

public static void bigdecimal() {
		BigDecimal val1 = new BigDecimal(7.0);
		BigDecimal val2 = new BigDecimal(3.0);
		BigDecimal result = val1.divide(val2, 0, RoundingMode.DOWN); // 소수점 미만을 버밀
		System.out.println(result);
		
		BigDecimal bigNum1 = new BigDecimal("500000.456789");
		BigDecimal bigNum2 = new BigDecimal("20000");
		
		System.out.println(bigNum1.add(bigNum2));
		System.out.println(bigNum1.subtract(bigNum2));
		System.out.println(bigNum1.multiply(bigNum2));
		System.out.println(bigNum1.divide(bigNum2, 6, RoundingMode.CEILING));
		
		System.out.println(bigNum1.intValue());
	}

Reference

Categories:

Updated:

Leave a comment