소수를 포함한 숫자를 표현할 수 있다.
이 소수라는 숫자는 매우 짜증나는 친구이다. 이놈을 명확히 표현할 방법이 없기에 부동소숫점이라는 것을 사용한다.
때문에 이 소수는 결국 오차가 발생할수밖에 없다.
자료형 | 기본값 | 자료크기 | 범위 |
---|---|---|---|
float | 0.0f | 4byte | 1.4E-45 ~ 3.4028235E38 |
double | 0.0d | 8byte | 4.9E-324 ~ 1.7976931348623157E308 |
실수를 표현하는 타입중 하나이다.
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번째부터 오차가 난다는 것을 알 수 있다.
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이 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");
더하기
System.out.println(var1.add(var3)); //0.5
빼기
System.out.println(var1.subtract(var3)); //0.1
곱하기
System.out.println(var1.multiply(var3)); //0.06
나누기
System.out.println(var1.divide(var3)); //1.5