본 코드:
public static void main(String[] args) {
// TODO Auto-generated method stub
//계산기
Scanner sc = new Scanner(System.in);
int num1 = sc.nextInt();
String operator = sc.next();
int num2 = sc.nextInt();
switch(operator){
case "+":
System.out.println(num1+num2);
break;
case "-":
System.out.println(num1-num2);
break;
case "*":
System.out.println(num1*num2);
break;
case "/":
if(num2 ==0) {
System.out.println("error");
break;
}else {
System.out.println(Math.round((float)num1/num2*1000)/1000f);
break;
}
}
}
문제가 발생한 부분은 두 부분이다.
첫 번쨰:
String operator = sc.next();
이 부분에서 'sc.next();' 대신 'sc.nextLine();'을 사용한 경우이다.
nextLine()을 사용한 경우에는 '4 / 3'을 입력한다 할 때 결과값이 출력되지 않는다.
그 이유에 대해서는 next()와 nextLine()에 차이에 존재한다.
next()는 개행문자를 무시하고 입력 받고 nextLine()의 경우 한 줄 단위로 입력받기 떄문에 개행문자를 포함한다.
예를 들어 위 코드를 실행하기 위해
4
/
3
순으로 입력한다고 하자.
4를 입력하고 enter를 쳤다면 버퍼에 4\n 이 존재한다. 이 떄 nextInt()가 버퍼 내용을 가져올 떄 분리자를 제외하고 가져오기 떄문에 \n 을 제외한 4만 가져오게 된다. 그러면 버퍼에 \n이 남게 되고 nextLine()은 개행문자를 포함하기 떄문에
\n을 가져오게 된다.
그렇기 때문에 위와 같이 입력을 시도한다면 num2를 입력할 부분에 "/"을 입력한 것으로 받아들여지므로
오류가 발생하게 된다.
내용출처: https://devlog-wjdrbs96.tistory.com/80
[JAVA] next(), nextLine() 의 차이
나는 지금까지 next()와 nextLine()의 차이는 단순히 한 줄을 전부 입력받고 싶을 때(한 문장을 입력한다던지)는 nextLine()을 사용하고 한 단어씩 입력하고자 할 때는 next()를 사용한다 정도의 가볍게
devlog-wjdrbs96.tistory.com
두 번쨰:
System.out.println(Math.round((float)num1/num2*1000)/1000f);
else문 부분을 작성하며 잘 못썼던 코드를 아래에서 볼 수 있다.
1.
System.out.println(Math.round((float)num1/num2*1000)/1000);
float임을 나타내기 위한 f를 빼먹은 경우이다.
나누는 1000뒤에 f를 붙인다면 정상적으로 출력된다.
2.
System.out.println((Math.round((float)num1/num2)*1000)/1000f);
괄호가 잘못쓰여 값이 잘못 출력되는 경우이다.
System.out.println( (Math.round( (float)num1/num2) *1000 )/1000f); 에서
(Math.round( (float)num1/num2) *1000 )의 Math.round 괄호로 묶여있는 부분을 잘 보면
1000을 곱해 소숫점 넷 째자리에서 반올림 시킨 것이 아니라
소숫점 첫 번째 자리에서 반올림 한 후 1000을 곱한 것으로 코드가 짜여있다.
Math.round 의 괄호가 1000뒤로 옮겨진다면 정상적으로 출력된다.
'Java > 발생한 문제점과 해결법' 카테고리의 다른 글
[Java] 자바 문법 에러 No enclosing instance of type is accessible (0) | 2022.06.11 |
---|---|
[Java] 별 찍기 회전 문제점 (0) | 2022.05.22 |
[개선] 대소문자 변환기 (0) | 2022.05.15 |
[생각] 2진수를 10진수로 바꾸기 (1) | 2022.05.14 |
[생각] 10진수를 2,8,16 진수로 바꿔 출력하기 (0) | 2022.05.14 |