자바스크립트 계산 오류가 나는 원인이 뭔가요?

김제연   
   조회 4042   추천 0    

어제 부가세 계산하는데 .. 

결과가 이상해서 보니 

27500 원에서 부가세 2500 원을 빼려고 

27500 / 1.1 이렇게 계산하면 25000 원이 나와야 하는데

자바스크립트에서는 24999.999999999996

게 나와버리네요 검색해보니 toFixed를 사용하면 된다고 하는데 

일단 fixed를 하긴 했는데 매번 저렇게 해줘야 하나요 ?

원천적으로 해결하는 방법은 없을까요? 올림내지 반올림 되는 느낌이던데 ㅜㅜ

왜 저런 오류가 생기는건가요 .?

짧은글 일수록 신중하게.
숫자를 부동소수점으로 처리해서 그런다고 하네요.

자바스크립트 배울 때 숫자계산에 문제가 있다고 배우긴 했네요.
     
김제연 2020-01
아 .. 요즘들어 그냥 go 언어로 갔으면 더 좋았을것 같다는 생각이 마구 듭니다.  ㅜㅜ
콜백헬부터 연산 까지... ㅜㅜ null 값 처리도 신경 써줘야 하고 ..
하얀아빠 2020-01
헉 부가세빼면 2천5백1원...
찬이 2020-01
IEEE754를 사용하는 언어는 모두 해당하는 문제입니다.
(모든 프로그래밍 언어가 그렇단 겁니다. go도 마찬가지일거 같습니다)

단순한 예로 0.1+0.2 != 0.3 인거죠.

이를 해결하기 위해선 반올림을 하거나 혹은 고정소수점 연산을 하면 됩니다.

고정 소수점 연산은 ((27500 * 10) / (1.1 * 10)) / 10 과 같이 고정 배수를 곱해 소수점을 없앤 후 정수연산을 하는 거죠.
다만 정확도를 높이기 위해 큰 수를 곱하는 경우 range가 작아져 오버플로가 날 수 있으니 자바스크립트에서는 bignumber.js나 bigint등을 이용할 수 있습니다.

참고로 자바스크립트는 2^53-1~-2^53까지 정수표현이 가능하지만 연산 시 32bit크기이면서 최상위비트가1인 숫자는 음수처리되어버리는 이슈가 있습니다.
따라서 2억대~4억대 숫자를 연산하며 올바르게 표현하려면 bignumber등을 사용하시는게 안전합니다.
     
김제연 2020-01
go 언어는 지금 테스트 해봤는데 ..
var test int = 27500 / 11;
25000 원 제대로 나오네요 .. 타입값이 int 형이라서 그런건가요?
자바스크립트는 int로 가져와도 ..
parseInt(27500/1.1)
24999
이런 결과가 나오구요 ..
          
찬이 2020-01
네 go의 int는 부동소수점 형식이 아닙니다.
자바스크립트는 숫자형은 자동으로 판단하여 정수/부동소수점 형식으로 바뀝니다.


QnA
제목Page 1170/5730
2014-05   5265333   정은준1
2015-12   1790310   백메가
2017-08   3616   e5472
2018-11   4055   반성만
2012-03   7250   마이코코
2014-03   4025   맹물
2024-08   1263   항공모함
2014-04   4579   akfalles
2012-03   6247   안성현
2014-04   5285   luciddream
2015-08   5656   PiPPuuP
2021-05   6382   bangCH
2015-08   6417   iwill
2021-05   3100   하나비
2024-09   985   영산회상
2024-09   1722   inquisitive
2021-06   1825   라이카
2018-12   2848   epage
2021-06   7184   뚜앙
2024-10   750   pumkin
2020-02   5956   박종대
2012-05   4872   김준유