2013-07-30 1 views
1

, 그 그것은 실제로 나에게 0을 제공해야 나에게 매우 이상한 대답자바 스크립트 덧셈과 뺄셈 나는이 코드 조각을 실행하려고 할 때 이상한

<script type="text/javascript"> 
    a = 17.98 + 7.99 - 17.98 - 7.99 + 0 - 0; 
    alert(a); 
</script> 

을주는 행동. 그러나 대신에 그것은 지수 적 가치를줍니다. 답을 좀 도와 주실 수 있습니까?

+0

을 http://stackoverflow.com/questions/1458633/elegant-workaround-for-javascript-floating-point-number- 문제 –

답변

2

-1.7763568394002505e-15가 표시됩니다. 이것은 -1.7763568394002505 * 10^(- 15)를 나타냅니다. 이 값은 0에 매우 가깝습니다. 그러나 당신이 0이되지 않는다는 사실은 반올림 오류 때문입니다. 이것은 정상적인 동작입니다. 당신이 정말로에 대해 자세히 알아하려면

, 당신은 더 많은 부동 소수점 연산을위한 정상적인 동작입니다 http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

+0

나는 다음과 같은 문제를 해결했다 : \t 이렇게하면 정확하게 제로가됩니다. 답장을 보내 주셔서 감사합니다. – unknown

+1

왜 정확히 0을 원하십니까? 컴퓨터는 항상 근사 결과를 제공하거나 두통을 준비한다는 사실을 명심해야합니다. -1을 가지고 기뻐하십시오.이미 7763568394002505e-15! – mdup

1

에서 확인할 수 있습니다.

사용 된 이진 부동 소수점 형식으로 정확하게 표현할 수있는 값의 수가 제한되어 있으므로 대부분의 값은 가능한 가장 가까운 값으로 표시됩니다.

7.99과 같은 값은 7.98999999999997754과 같이 표시 될 수 있습니다. 코드가 구문 분석 될 때 실제로 얻게되는 값입니다.

실제 값과 예상 값의 차이가 너무 작기 때문에 값을 직접 표시 할 때 나타나지 않습니다. 값을 문자열 형식으로 되돌릴 때 값이 반올림되므로 반올림됩니다. 몇 가지 계산을 할 때 작은 차이가 더 해지고 조만간 당신은 그것을 볼 것입니다.

얻은 결과는 -0.0000000000000017763568394002505이므로 0에 매우 가깝지만 정확히 0은 아닙니다.

1

컴퓨터는 부동 소수점을 처리 할 때 실제로 좋지 않습니다.

예 : = 0.30000000000000004

내부적 컴퓨터 정확하게 모든 0.1, 0.2 또는 0.3와 같은 숫자를 나타낼 수있는 포맷 (이진 부동 소수점) 사용하기 때문에 0.1 + 0.2. 코드가 컴파일되거나 해석 될 때 "0.1"은 이미으로 가장 가까운 숫자로 반올림되어 결과가 계산되기 전에 반올림 오류가 작은 이됩니다.

가 더 읽기 :이 대한 자세한 내용을 여기 읽을 수 있습니다 What Every Programmer Should Know About Floating-Point Arithmetic

0
a = Math.ceil(17.98 + 7.99 - 17.98 - 7.99 + 0 - 0); 
+0

그게 둥근 값을 줄 것이지만, _why_이 일이 - 내가 생각하는 질문을 설명하지 않습니다. –

+0

설명은 많은 전문가들에 의해 이미 이전에 주어 졌는데, 이것은 하나의 _를위한 것입니다. 실제로 제게 0을 주어야합니다. OP는 질문 이후에 반올림 된 값을 원할 것 같습니다 – rps

+0

이렇게하면 정확히 0이됩니다. 답장을 보내 주셔서 감사합니다. – unknown