[TIL]20210906

박창현·2021년 9월 6일
0

TODAY I LEARNED

목록 보기
42/53

자바

인풋 방법

import java.util.Scanner;
		Scanner scanner = new Scanner(System.in);
		String strNum1=scanner.nextLine();

연산자 우선순위

모르고있던 부분. 단항 연산자( ++, --, ~, !), 부호 연산자(+, -), 대입 연산자 (=, +=, -=, 등) 은 오른쪽에서 왼쪽 방향으로 연산을 수행


일반적일때.

특수한 경우.

정리:
1. 단항, 이항, 삼항 연산자 순으로 우선순위를 가진다.
2. 산술, 비교 논리, 대입 연산자 순으로 우선순위를 가진다.
3. 단항, 부호, 대입 연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽이다.
4. 복잡한 연산식에는 괄호를 사용해서 우선순위를 정한다.

문자열 결합 연산자(+)

간혹 + 연산자가 산술 연산자인지 문자열 연산자인지 판단하기 어려운 경우가 있다.
"jdk"+3+3.0" --> jdk33.0
"3+3.0+"JDK" --> 6.0jdk
왼쪽에서 오른쪽으로 타입이 유동적인 느낌으로 연산된다는 점을 참고.

비교 연산자에서의 자동 형 변환

'A'==65 --> 65==65 --> true
'3==3.0 --> 3.0==3.0 --> true
이렇게 자동으로 피연산자들의 타입을 일치시켜준다.
단, 예외가 하나 있는데 0.1==0.1f --> false 이다.
이는 부동 소수점이 0.1을 정확히 표현할 수 없기 때문이다.

이에 대해 찾아봤는데 자세한 내용은 https://codingdog.tistory.com/entry/c%EC%96%B8%EC%96%B4-double%ED%98%95-vs-float%ED%98%95-%EC%96%B4%EB%96%A4-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EC%9E%88%EC%9D%84%EA%B9%8C%EC%9A%94 이 글을 참고하고,
결론적으로 말하자면

		float F= 0.1f;
		double D=0.1;
		
		System.out.printf("%.20f\n%.20f",F,D);	

result:
0.10000000149011612000
0.10000000000000000000

또한, 자연스럽게 생긴 의문이 double을 float으로 바꾸면 false가 나올까 이다.

float은 double에 비해 0.1을 덜 정확하게 표현하기 때문에 float이 부동 소수점의 표현이 더 큰 double로 형변환을 하면 0.10000000149011612000 여기뒤에 0을 더 붙이는 꼴밖에 되지 않지만, double을 float으로 형변환 한다면 부동 소수점의 표현 범위가 더 축소되면서 0.10000000000000000000에서 0.10000000149011612000으로 변하기 때문이라고 추측한다.

profile
개강했기에 가끔씩 업로드.

0개의 댓글