자바스크립트 소수점 비교 - jabaseukeulibteu sosujeom bigyo

<html>
<head>
<script type="text/javascript">
<!--
var tempQty       = 0;
var tempPrice     = 0.00;
var tempFeight    = 0.00;
var orderTotalAmt = 382.92;

tempPrice  = 130;
tempQty    = 1;
tempFeight = 0.00;

orderTotalAmt = orderTotalAmt + (tempPrice * tempQty) + tempFeight;

document.writeln(orderTotalAmt + "<br>"); //512.9200000000001

-->

</script>
</head>
<body>
<form name="myForm">
<input type="button" name="btnTEST" onClick="javascript:f_doubleCal();">
</form>
</body>
</html>

위와 같이 orderTotalAmt에 다음의 값을 바꾸면서 연산을 하면 이상하게 연산을 한다.

<!--

orderTotalAmt - 결과값
381.32 - 511.32
382.32 - 512.3199999999999
382.42 - 512.4200000000001
390.42 - 520.4200000000001
399.42 - 529.4200000000001
410.42 - 540.4200000000001
411.32 - 541.3199999999999
411.42 - 541.4200000000001
412.32 - 542.3199999999999
412.42 - 542.4200000000001
413.32 - 543.3199999999999
413.42 - 543.4200000000001
450.42 - 580.4200000000001
499.42 - 629.4200000000001
500.42 - 630.4200000000001
510.42 - 640.4200000000001
511.42 - 641.4200000000001
512.42 - 642.42
--> 

왜 쓸데 없이  00000000001, 99999999999 요런 숫자들이 붙는건지... ㅠㅜ

그래서 검색을 해봤다.

Q. 자바스크립트 소수점 연산 질문입니다.

간단한 마이너스 연산인데요, 스크립트에서

 <script>
 var a = 193.74;
 var b = 193.73;
 c = a-b;
 alert(c);
  </script>

라는 연산을 수행했을 경우 기대하는 답은 0.01인데,

0.010000000000019326 이런 답이 나옵니다.

왜 그럴까요?

 re: 자바스크립트 소수점 연산 질문입니다.

 ──────────────────────────────────────────────────

안녕하세요..

소수점 계산의 문제 때문에 여러 가지 방법으로 처리하는 경우를 종종 목격하게 됩니다.

또한 정수의 경우도, 기억공간의 범위 수치가 딱히 정해져 있는 것이 아니라(물론 큰 값이겠죠)..

정점의 한계에 도달하면, 특정한 규칙성을 따르면서 여러 유형의 한계 범위가 존재합니다. 

자세한 설명은 아래 글을 참고해보세요.

──────────────────────────────────────────────────

http://www.merlyn.demon.co.uk/js-maths.htm

http://www.merlyn.demon.co.uk/js-round.htm

위 주소에 참조할만한 설명이 있네요..

저 주소에서 보고서 했는데,

아래처럼 하면 해결되네요.

var a=3.3;
var b=1.1;
var T=Number('1e'+1);
alert(Math.round((a-b)*T)/T);

음,,

지식인에 뒤져보고서,, 제가 이해한 부분만 쉽게 설명해 드리겠습니다.

자바스크립트는 부동소수점 방식(floating point)으로 계산을 하며IEEE Standard 754규격을 사용합니다.

자바스크립트는 실수의 변환을 위해 53bit의 연산을 합니다.

정수인 경우에는 해당 기억공간의 범위안에서 정확한 결과를 나타내는데,,

실수인 경우에는 기억공간의 범위를 벗어나는 결과가 나타나면 나머지수를 버립니다.

컴퓨터가 연산을 위해 소수점 이하의 자릿수를 이진수로 변환하는 과정에서,,

예를들어,

0.3 을 이진수로 바꾼다면,,

0.3 * 2 = 0.6

0.6 * 2 = 1.2

0.2 * 2 = 0.4

0.4 * 2 = 0.8

0.8 * 2 = 1.6

0.6.. <== 다시 0.6이 나와,, 0.0100110011001.... 와 같이 무한히 반복됩니다.

0.3의 이진수처럼 기억공간의 한계를 벗어나는 결과치가 나오는 경우에는

부정확한(최대한 가까운?) 연산을 하게 되는 것이지요.

예..)

//0.2 ==> 0.2

alert(2*(1e-1));

//0.3 ==> 0.30000000000000004
alert(3*(1e-1));

그래서 위와 같이 연산이 되는 경우는 다음과 같이 해결한다.

//소수 셋째 자리에서 반올림.
document.writeln(orderTotalAmt.toFixed(2) + "<br>");
//소수 셋째 자리에서 반올림.
document.writeln(Math.round(orderTotalAmt * 100) / 100 + "<br>");
//소수 셋째 자리에서 버림.
document.writeln(parseInt(orderTotalAmt*100) / 100 + "<br>");

자바스크립트 소수점 비교 - jabaseukeulibteu sosujeom bigyo