Java 실수형 변수

김범준·2022년 11월 9일
0

Java

목록 보기
4/11
post-thumbnail

타입

소수를 포함한 숫자를 표현할 수 있다.
이 소수라는 숫자는 매우 짜증나는 친구이다. 이놈을 명확히 표현할 방법이 없기에 부동소숫점이라는 것을 사용한다.
때문에 이 소수는 결국 오차가 발생할수밖에 없다.

자료형기본값자료크기범위
float0.0f4byte1.4E-45 ~ 3.4028235E38
double0.0d8byte4.9E-324 ~ 1.7976931348623157E308

float 타입

실수를 표현하는 타입중 하나이다.
Java에서 소수의 기본타입이 double이기 때문에 선언시 f를 붙여 선언해야 한다.

float var1 = 0.1f;

위에서 말했듯 float는 오차가 존재한다.

float var1 = 0.0f;
for(int i = 0; i < 100; i++){
    var1 += 0.1f;
}
System.out.println(var1); //10.000002

위 예시를 보면 0.1을 100번 더했으니 10이 나와야 하지만 소숫점 6번째부터 오차가 난다는 것을 알 수 있다.

double 타입

Java의 소숫점 표현 기본 타입이다.

double var1 = 0.1;

float처럼 뒤에 따로 붙이는거 없이 사용이 가능하다.
대신 차지하는 공간이 float보다 크기 때문에 상황에 맞춰서 사용하자.

double도 float처럼 오차가 존재한다.

double var1 = 0.0;
for(int i = 0; i < 100; i++){
    var1 += 0.1;
}
System.out.println(var1);//9.99999999999998

이도 위처럼 0.1을 100번 더했으나 10이 아닌 9.99999999999998이 된다.
이도 오차가 나지만 float과의 차이점은 더 큰크기를 다룰 수 잇어 오차가 float보다 적다.

오차

소수의 경우 근사값을 넣기 때문에 정확한 0.1이 없다.
때문에 BigDecimal이라는 클래스를 사용한다.

BigDecimal

BigDecimal이 double보다 약 2배정도 길어 더 정확한 연산이 가능하다고 한다.
그리고 표현시 근사값이 아닌 해당 소수에서 유요한 숫자를 기준으로 표현하기 때문에 정확한 소수 표현이 필요할때는 BigDecimal을 사용하자.
선언시 import java.math.BigDecimal;로 임포트 후 선언하자.

BigDecimal var1 = new BigDecimal("0.2");

보다시피 선언시 0.2가 아닌 문자열의 형태의 "0.2"를 작성했다. 0.2를 집어넣으면 double의 형태로 인식해 다시 오차가 나는 소수가 되어버린다.

BigDecimal은 클래스이기 때문에 +와 같은 연산이 안되며, ==와 같은 비교연산도 예측하지 못한 값을 낼 수 있다.
때문에 Bigdecimal내부 함수를 이용하여 연산하도록 하자.

비교 연산

위에서 말한것처럼 ==같은 비교연산이 안된다. 때문에 equals, compareTo를 사용해야 한다.

BigDecimal var1 = new BigDecimal("0.2");
BigDecimal var2 = new BigDecimal("0.20");
System.out.println(var1 == var2); //false
System.out.println(var1.equals(var2)); //false
System.out.println(var1.compareTo(var2)); //0

==는 객체가 같은 객체인지 비교하는 것이므로 false가 나온다.
equals는 자릿수의 숫자도 일치해야만 true가 나오게 된다.
compareTo는 수치를 비교한다. 대신 같을때 0, 왼쪽이 크면 1, 오른쪽이 크면 -1을 반환한다.

사칙 연산

소숫점끼리의 사칙 연산이다.

BigDecimal var1 = new BigDecimal("0.3");
BigDecimal var3 = new BigDecimal("0.2");
  1. 더하기

    System.out.println(var1.add(var3)); //0.5
  2. 빼기

    System.out.println(var1.subtract(var3)); //0.1
  3. 곱하기

    System.out.println(var1.multiply(var3)); //0.06
  4. 나누기

    System.out.println(var1.divide(var3)); //1.5
profile
그럴싸한 계획을 가지고 있는

0개의 댓글