목록이것이 자바다 (108)
충분히 쌓여가는
0.1f == 0.1에서 0.1f가 double 타입으로 변환되면 0.1 == 0.1이 될거 같지만 되지않고 false가 나온다 부동 소수점 방식을 사용하는 실수 타입은 0.1을 정확히 표현할 수 없고 float 타입과 double 타입의 정밀도 차이가 있다 해결책으로 float 타입으로 강제 타입 변환 후 비교 연산을 수행하면 된다 0.1f == (float) 0.1 // true
나눗셈(/) 또는 나머지(%) 연산에서 좌측 피연산자가 정수이고 우측 피연산자가 0일 경우 예외(ArithmeticException)가 발생한다 무한대의 값을 정수로 표현할 수 없기 때문 int x = 5; int y = 0; int result = 5 / 0; //예외 발생 좌측 피연산자가 실수이거나 우측 피연산자가 0.0 또는 0.0f이면 예외가 발생하지 않고 연산의 결과는 Infinity(무한대) 또는 NaN(Not a Number)이 된다 5 / 0.0 -> Infinity 5 % 0.0 -> NaN 문제점은 Infinity 또는 NaN 상태에서 계속해서 연산을 하면 안된다 어떤 연산을 하더라도 결과는 계속해서 Infinity와 NaN이 되므로 데이터가 엉망이 될 수 있다 Infinity + 2 ..
package ch03.sec04; public class AccuracyExample1 { public static void main(String[] args) { int apple = 1; double pieceUnit = 0.1; int number = 7; double result = apple - number*pieceUnit; System.out.println(result); } } 0.29999999999999993 result의 값이 정확히 0.3이 되지 않는다 -> 부동 소수점 방식을 사용하는 실수 타입에서 흔히 일어난다 정확한 계산이 필요하다면 정수 연산으로 변경해서 사용하는 것이 좋다 package ch03.sec04; public class AccuracyExample2 { publ..
오버플로우 overflow 타입이 허용하는 최대값을 벗어나는 것 언더플로우 underflow 타입이 허용하는 최소값을 벗어나는 것 정수 타입 연산에서 오버플로우 또는 언더플로우가 발생되면 실행 에러가 발생할 것 같지만, 해당 정수 타입의 최소값 또는 최대값으로 되돌아간다 byte 타입일 경우 최대값 127에서 1을 더하면 128이 되어 최소값인 -128이 된다 byte value = 127; value++; System.out.println(value); // -128 -128에서 1을 빼면 최대값인 127이 된다 byte value = -128; value--; System.out.println(); short, int long 타입은 값의 범위만 다를 뿐 오버플로우 및 언더플로우가 발생했을 때 최소값..