Programing

Javascript에 소수점 두 개를 추가하면 잘못된 결과가 생성되는 이유는 무엇입니까?

crosscheck 2020. 12. 31. 22:50
반응형

Javascript에 소수점 두 개를 추가하면 잘못된 결과가 생성되는 이유는 무엇입니까?


중복 가능성 :
JavaScript의 수학이 깨졌습니까?

JS가이 간단한 수학을 망친 이유는 무엇입니까?

console.log(.1 + .2)  // 0.3000000000000004
console.log(.3 + .6)  // 0.8999999999999999

첫 번째 예는 올바른 결과보다 크고 두 번째 예는 더 적습니다. ??? !! 이 문제를 어떻게 해결합니까? 연산을 수행하기 전에 항상 소수를 정수로 변환해야합니까? 추가에 대해서만 걱정할 필요가 있습니까 (* 및 / 내 테스트에서 동일한 문제가없는 것 같음)?

나는 많은 곳에서 답을 찾았습니다. 일부 자습서 (예 : 장바구니 양식)에서는 문제가없는 것처럼 가장하여 값을 함께 추가합니다. Gurus는 다양한 수학 함수에 대한 복잡한 루틴을 제공하거나 JS가 통과 할 때 "잘못했습니다"라고 언급하지만 아직 설명을 보지 못했습니다.


JS 문제가 아니라 더 일반적인 컴퓨터 문제입니다. 부동 숫자는 항목을 이진수로 저장하기 때문에 모든 10 진수를 제대로 저장할 수 없습니다. 예를 들면 다음과 같습니다.

0.5 is store as b0.1 
but 0.1 = 1/10 so it's 1/16 + (1/10-1/16) = 1/16 + 0.0375
0.0375 = 1/32 + (0.0375-1/32) = 1/32 + 00625 ... etc

so in binary 0.1 is 0.00011... 

그러나 그것은 끝이 없습니다. 컴퓨터가 어느 시점에서 멈춰야한다는 점을 제외하면. 따라서이 예에서 0.00011에서 멈 추면 0.1 대신 0.09375가됩니다.

어쨌든 요점은 언어에 의존하지 않고 컴퓨터에 의존한다는 것입니다. 언어에 따라 숫자를 표시하는 방법이 다릅니다. 일반적으로 언어는 숫자를 허용 가능한 표현으로 반올림합니다. 분명히 JS는 그렇지 않습니다.

그래서 당신이해야 할 일은 (메모리에있는 숫자가 충분히 정확하다) JS에게 숫자를 텍스트로 변환 할 때 "멋진"숫자를 반올림하도록 지시하는 것입니다.

sprintf숫자를 표시하는 방법을 세밀하게 제어 하는 기능을 사용해 볼 수 있습니다 .


에서 부동 소수점 가이드 :

0.1 + 0.2와 같은 내 숫자가 0.3 라운드에 더해지지 않고 대신 0.30000000000000004와 같은 이상한 결과가 나오는 이유는 무엇입니까?

내부적으로 컴퓨터는 0.1, 0.2 또는 0.3과 같은 숫자를 정확하게 나타낼 수없는 형식 (이진 부동 소수점)을 사용하기 때문입니다.

코드가 컴파일되거나 해석 될 때 "0.1"은 이미 해당 형식에서 가장 가까운 숫자로 반올림되어 계산이 발생하기 전에도 작은 반올림 오류가 발생합니다.

이 사이트에는 자세한 설명과 문제 해결 방법 (및 귀하의 경우 문제인지 여부를 결정하는 방법)에 대한 정보가 있습니다.


이것은 자바 스크립트 전용 제한이 아니며 모든 부동 소수점 계산에 적용됩니다. 문제는 0.1과 0.2 및 0.3이 자바 스크립트 (또는 C 또는 Java 등) 부동으로 정확하게 표현할 수 없다는 것입니다. 따라서 당신이보고있는 출력은 그 부정확성 때문입니다.

특히 2의 거듭 제곱의 특정 합만 정확하게 표현할 수 있습니다. 0.5 = = 0.1b = 2 ^ (-1), 0.25 = 0.01b = (2 ^ -2), 0.75 = 0.11b = (2 ^ -1 + 2 ^ -2) 모두 괜찮습니다. 그러나 1/10 = 0.000110001100011..b는 2의 거듭 제곱의 무한한 합으로 만 표현할 수 있으며, 언어는 어느 시점에서 잘립니다. 이러한 사소한 오류를 일으키는이 절단.


모든 10 진수 값을 이진으로 정확하게 표현할 수있는 것은 아니기 때문에 이는 모든 프로그래밍 언어에서 정상입니다. 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 사항 보기


컴퓨터가 부동 수를 처리하는 방법과 관련이 있습니다. 자세한 내용은 http://docs.sun.com/source/806-3568/ncg_goldberg.html을 참조하십시오.

참조 URL : https://stackoverflow.com/questions/3439040/why-does-adding-two-decimals-in-javascript-produce-a-wrong-result

반응형