티스토리 뷰

 이전 글에서 정수 형식과 실수 형식에 대해서 살펴보았습니다. 그러나 실수 형식의 경우 출력결과가 예상했던 값이 아니라 이상한 값이 나오는 것을 보고 의문점을 남겨두었었죠. 그래서 이번 글에서는 그 의문점을 풀어보도록 하겠습니다.

예제 코드

아래는 예제 코드 입니다.

fun main(args:Array<String>):Unit
{
    println(0.1f + 0.1f + 0.1f)
    println(0.1f +0.1f +0.1f +0.1f +0.1f +0.1f +0.1f +0.1f +0.1f +0.1f)
    println(0.1f * 10)
}

아래는 예제 코드의 실행 결과입니다.

0.3
1.0000001
1.0

Process finished with exit code 0

코드 해설

 코드에 대한 해설을 각 줄마다 진행해보겠습니다.

3(번 줄): 먼저 0.1f를 세 번 더했습니다. 이때 0.1f는 Float형 즉, 실수형이죠. 예상 결과는 0.3이며, 실행 결과를 확인해보면, 올바르게 출력된 것을 알 수 있습니다.

4: 다음은 0.1f를 10번 더했을 경우입니다. 과연 1.0이 제대로 출력될까요? 하지만 예상과는 달리 1.0000001이 출력되었습니다. 왜 그럴까요? 그 이유는 소수점을 표현하는 과정에서 2진수로 표현되어 저장이 되는데 2진수로 저장할 때 소수점이 정확하게 떨어지지 않는 무한 소수가 되기 때문입니다. (0.1을 저장하면 근삿값인 0.100000001490116119384765625로 바뀌어서 저장이 된다고 합니다.) 때문에 이런 값이 10번이나 누적되어 연산된다면, 오차 또한 10번이 누적되기 때문에 예상 결과와는 달라지게 되는 것이죠.

5: 하지만 0.1f를 10과 곱해준 경우에는? 이는 사실 연산이 단 1번만 진행되기 때문에 오차도 그만큼 덜 누적되어 다행히도 결과가 잘 출력된 것입니다.

결론

 이처럼 개발 시에 Float형처럼 실수형을 사용하게 될 경우 오차가 발생할 수 있는 큰 위험이 따릅니다. 그렇기 때문에 실수형을 연산할 경우 오차가 생기는 것은 필연적이며, 대략적인 값만을 얻을 수 있다는 점을 염두에 두고 코딩해야 합니다. 특별한 경우가 아니라면, 정수 타입을 사용하는 것이 좋다고 합니다.

 다음에는 문자 타입에 대해서 알아보도록 하겠습니다. 고생하셨습니다!

[Android/Kotlin] - [코틀린] 정수, 실수 타입 정리 한 번에 끝내기 (Byte, Short, Int, Long, Float, Double)

[Android/Kotlin] - [코틀린] 비트 연산자 7개 한 번에 이해하기 (and, or, xor, inv, shl, shr, ushr)

[Android/Kotlin] - [코틀린] 증감 연산자(++,--) 이해하는데 3초 컷

댓글
댓글쓰기 폼
네이버 이웃추가
«   2020/11   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
글 보관함