2009-10-20 3 views
1

Hey all, ECMAScript/JavaScript/AS3에서 간단한 수학 연산을 수행 할 수없는 방법을 보여주기 위해 코드 샘플로 바로 넘어 갑시다 (AS3에서는 Number 클래스에 대해 'IEEE-754 배정 밀도 부동 소수점 숫자'를 사용합니다). 자바 스크립트에서 사용되는 것과 동일) ...왜 ECMAScript/ActionScript 3에서 부정확 한 부동 소수점 결과가 표시됩니까?

trace(1.1);   //'1.1': Ok, fine, looks good. 
trace(1.1*100);  //'110.00000000000001': What!? 
trace((1.1*100)/100); //'1.1': Brings it back to 1.1 (since we're apparently multiplying by *approximately* 100 and then dividing by the same *approximate* '100' amount) 
trace(1.1*100-110); //'1.4210854715202004e-14': Proof that according to AS3, 1.1*100!=110 (i.e. this isn't just a bug in Number.toString()) 
trace(1.1*100==110); //'false': Even further proof that according to AS3, 1.1*100!=110 

무엇을 제공합니까?

+1

100 년대 있습니다 * 정확한. 근사치 인 1.1입니다 (2 진수로 1/10을 표현할 수있는 한정된 방법이 없습니다). 'trace (1.1)'이 올바른 이유는 십진수가 충분하기 때문입니다. 100을 곱하면 오류가 인쇄되는 부분으로 옮겨집니다. –

답변

9

에 오신 것을 환영합니다. 일반적으로 부동 소수점 계산은 매우 정확한 결과를 제공하지만 절대 값 평등에 대한 출력을 비교하면 반올림 함수를 사용하지 않고 예상 한 결과를 얻지 못할 수 있습니다.

2

부동 소수점 불일치는 많은 언어에서 알려진 문제입니다. 컴퓨터가 부동 소수점 숫자를 처리하도록 설계되지 않았기 때문입니다. moonshadow 상태로

Have fun

2

, 당신은 부동 소수점 정밀도 문제로 실행 중입니다. 부동 소수점 수는 사용자가 예상하는 방식으로 10 진수 값에 대한 산술 표현 및 수행 작업에 적합하지 않습니다. 이러한 종류의 문제는 사람들이 재무 계산을 위해 부동 소수점 숫자를 사용하려고 할 때 가장 자주 발생합니다. 위키 피 디아 엔트리는 좋지만이 페이지에서는 오류가 발생하기 쉬운 재무 계산을 수행합니다. http://c2.com/cgi/wiki?FloatingPointCurrency

10 진수를 정확하게 처리하려면 10 진수 라이브러리가 필요합니다. 내가 다른 SO 게시물에 필요에 따라 할 수있다 자바 스크립트로 작성된이 BigDecimal의 스타일 라이브러리를 마련했습니다, 잘하면 당신은 그들이 유용하게 찾을 수 있습니다 : 세 번째 줄의 *에서

https://stackoverflow.com/questions/744099/javascript-bigdecimal-library/1575569