Rev. 2.73

a = 79.99 * 100;
//=> 7998.999999999999 (7999.0)
Math.floor(a);
//=> 7998 
b = 7999.0;
//=> 7999.0
Math.floor(b);
//=> 7999

dan씨의 블로그에 포스트 된 재미있는 자바스크립트 산술연산 오류입니다. 어떻게 "79.99 * 100"의 값이 "7998.999999999999"가 될수 있나요. 쩝. 자바스크립트에 조금 실망했습니다. 어쨌거나, 새해 복 많이 받으세요!

Comments

Got something to add? You can just leave a comment.

  • 이건 JavaScript의 오류도 아니고, 산술 연산 오류도 아닙니다. 부동소수점을 표현하는 방식에서 비롯된 문제입니다. IEEE 754에 대한 자료를 참고하세요. 흐흐;

    http://ko.wikipedia.org/wiki/IEEE_754

    reply edit

  • 으헉! 모든언어가 원래 그랬단 말인가요?
    상식적으로는 너무 이해하기 힘드네요.
    아무튼, 좋은 정보 고맙습니다.

    reply edit

  • 홍민희 님의 말씀대로 자바스크립트의 오류가 아닙니다. : ) 자바스크립트는 부동소수점 연산에 이진 부동소수점 연산을 사용하고 있고, 이진수로 부동소수점을 정확하게 표현할 수 없고, 근사값으로만 표현할 수 있기 때문에 이러한 결과가 나오게 됩니다(십진 부동소수점 연산을 사용하면 결과는 정확하지만 연산의 속도가 느려지겠지요).

    암튼, 자바스크립트 뿐 아니라 루비, 자바와 같이 2진 보동소수점 연산을 사용하는 모든 언어에서는 위와 같은 결과가 나옵니다.

    reply edit

  • 아~ 그런 것이었군요.(다른 언어에서도 그렇다니, 저만 몰랐나봐요;)
    명백한 오류처럼 보이지만 오류가 아니라고 알고있어야 하는...
    참 아이러니합니다.

    reply edit

  • 개굴씨 개굴씨

    200 + 99.91 이값도 ... =_= 299.90999999999996 이런식으로 나와요 ㅠ

    14.9955 * 10 이런것도 ㅠㅠ

    애매해요 -_-

    reply edit

  • 그러게 말예요, 부동소수점 연산은 가급적 피하는 것이 좋겠습니다.

    reply edit

  • 표현상의 문제도 있겠지만.....
    우스개 소리를 하자면 다른 연산에서는 오류겠지만....
    7998.999999999999가 표현할 수 있는 최대의 길이라고 가정하고
    소숫점 아래 9가 계속해서 반복되는 값이라고 본다면 7999와 같은 값입니다.. (빙긋)

    reply edit

  • 하핫 그렇군요.

    reply edit

  • 냥

    무슨소리.. 방금 VB에서 때려봤는데.. 79.99 * 100 하니까 7999 잘만 나오네요..

    전에 웹상에서 점수계산 하다가 저런 얼토당토 않은 에러를 만나서 자바스크립트에 대한 믿음이 완전 깨졌습니다.

    부동소수점 계산 오류란건 1/3 * 3 하면 0.9999999 나오는 그런 문제이지요 (컴은 분수로 계산하는게 아니니까요)

    79.99*100같은건 너무나 명확해서 절대 틀리게 나와선 안되는겁니다.

    reply edit

  • 수빈아부지 수빈아부지

    저도 이전에 자바스크립트로 계산하던게 값이 제대로 안나와서
    VBscript로 수치연산부분만 처리했던 기억이 나네요

    reply edit

  • 떠돌이 떠돌이

    var a = 79.99*100;
    a = Math.round(a * 10000) / 10000;
    위의 식으로 10000을 곱하여 반올림후 10000을 나누면 값이 정확하게 나옵니다.

    reply edit

Your Reaction Time!

captcha

avatar