Precision safe conversion from float to double in Java

  Java/Kotlin에서 float 타입 변수를 double 타입 변수에 대입할 때, <Code 1> 과 같이 하게 되면 값의 precision에 문제가 생긴다. 물론, 개발자가 의도한 것일 수도 있지만, 가끔씩 이를 무시하고 지나치면 계산 결과가 달라질 수 있기 때문에 주의를 요해야 한다. 가장 간단한 해결책은 float 변수에 저장된 값을 String 타입으로 잠시 type casting한 다음 결과를 얻는 것이다.

  그러면 결과적으로, float 타입의 precision으로 저장되어있던 실수값을 double type의 precision으로 변환할 수 있다. 이 문제는 단순히 Java Float native class의 toDouble 멤버함수의 문제이므로, 다른 언어에서는 발생하지 않을수도 있겠다.
fun main(args: Array) {
    // Kotlin
    var f: Float = 0.1f;
    var d_convert: Double = f.toString().toDouble();
    var d_ordinary: Double = f.toDouble();
    println("%.30f".format(f));
    println("%.30f".format(d_convert));
    println("%.30f".format(d_ordinary));
}
<Code 1>
0.100000001490116120000000000000
0.100000000000000000000000000000
0.100000001490116120000000000000

<Result 1>

댓글

이 블로그의 인기 게시물

Linux에서 특정한 디렉토리가 차지하는 용량을 효율적이고, 빠르게 계산하는 법(Fast, efficient way to calculate directory size recursively on linux)

Proof of well-known 'Intersection Of Three Planes' formula.

영화 'Call me by your name'의 OST 중 'Visions of Gideons' 번역 및 해석