본문 바로가기

diary/byromself

06/01/22 java/ int끼리 나누면 결과는 int로만 나온다 소수점 x

int[] progresses = {93, 30, 55};
int[] speeds = {1, 30, 5};

List<Integer> days = new LinkedList<>();
for (int i = 0; i < progresses.length; i++) {
	int day = (int) Math.ceil((100 - progresses[i]) / speeds[i]);
	days.add(day);
}

이렇게 작성한 코드의 경우 원하는 것처럼 작동하지 않는다. 애초에 Math.ceil을 쓰는 의미가 없어지게 된다.

 

 

progress[1], speeds[1]인 경우에 

int day = (int) Math.ceil((100-30)/30);

연산을 수행할 때 당연히  (100-30)/30 부분에서 소수점까지 계산되어 ceil이 적용될 거라고 생각했다.

 

하지만 컴퓨터는 말해주지 않으면 모르는.... 멍청아.............

int 타입 데이터를 int 타입 데이터로 연산하면 무엇을 연산하든 항상 결과는 int 타입 데이터를 뱉는다.

따라서 원하는 값인 2.333.... 의 값을 얻기 위해서는 float이나 double로 값을 선언해주어야 한다.

 

 

물론

double day = (100 - 30) / 30;

로 선언한다고 double 타입 데이터가 되는 것은 아니다. int 타입 데이터가 사용된 (100-30)/30으로 연산이 끝나 나온 결과값 '2'가 단지 저장될 때 double 타입으로 변환되어 day에는 '2.0' 이 저장되게 된다.

 

 

따라서 원하는 값을 얻기 위해서는

for (int i = 0; i < progresses.length; i++) {
	int day = (int) Math.ceil((float)(100 - progresses[i]) / speeds[i]);
	days.add(day);
}

와 같이 float/double 타입이 되도록 casting을 해주고 사용해야 한다.

 

 

당연히 밑과같이 작성해도 같은 결과를 얻는다.

for (int i = 0; i < progresses.length; i++) {
	int day = (int) Math.ceil((100 - progresses[i]) /(float) speeds[i]);
	days.add(day);
}
for (int i = 0; i < progresses.length; i++) {
	float p = progresses[i];
	float s = speeds[i];
	int day = (int) Math.ceil((100-p)/s);
	days.add(day);
}

 

*기본적인 부분에 조금 더 신경쓰면서 문제를 풀자