반응형

 

오랜만에 javascript 소수점을 계산하다 의문점이 생겨 이렇게 글을 남겨요~~

문제 : 0.1+0.2

정답 : 0.30000000000000004

크롬 console 창에 위와 같아 연산을 해보면 답이 우리가 알고 있는 답이랑 달라요~

 

왜 그럴까요?

 

먼저 JavaScript Numbers에 대해 알아보고 갈까요?

자바 스크립트 숫자는 항상 64 비트 부동 소수점입니다

다른 많은 프로그래밍 언어와는 달리, 자바 스크립트는 정수처럼, 짧은, 긴, 부동 소수점 등 번호의 다른 유형을 정의하지 않습니다

자바 스크립트 번호는 항상 국제 IEEE 754 표준에 따라 배정 밀도 부동 소수점 숫자로 저장됩니다.

수 (비율)이 비트에 저장된 64 비트의 저장 형식이 숫자 0 내지 51 비트 52 내지 62의 지수 비트 및 63에서 기호 

 

(기간 또는 지수 표기가 없는 번호) 정수는 15 자리의 정확도까지입니다.

위 이미지처럼 15 자리 수와 16자리 수위 값이 달라요....

 

 

 

 

소수점에 더하기에 문제를 해결하기 위해

1. 곱셈과 나눗셈

var x = 0.1+0.2x;  //결과 : 0.30000000000000004
var y = (0.1 * 10 + 0.2 * 10) / 10;  y;  //결과 : 0.3

 

 

 

2. Number.toFixed() : 인자로 넘긴 수만큼의 소수점 이하를 반올림하여 문자열 형태로 반환하는 메서드.

var x = 0.1+0.2x.toFixed(1);  //결과 : "0.3"

Number.toFixed() 메서드의 문자열 형태로 반환한다는 것을 잊으면 안돼요

그리고 소수점 자리 수를 알아야 한다는 거예요 

var x = 0.1+0.2x.toFixed();  //결과 : "0"

우리가 원하는 답이 아닐 수도 있어요~

 

결과만 필요할  Number.toFixed() 메서드를 사용해야 하지만 매번 소수점 자리 수를 찾는 건 좋은 방법이 아닐 수 있어요

예전에 계산해야 할 소수점을 []에 저장하고 

for문을 돌려서 소수점이 가장 많은 개수를 가져와서 Number.toFixed() () 안에 넣을 수 있도록 했어요~~

function decimalFits(arr){//소수점 자리수가 가장많은 수 return
  var decimalN = 0;
  for(var j=0; j<arr.length; j++ ){
    var n = arr[j];          
    if(!Number.isInteger(n)){ //소수
      var d = String(n).split('.')[1].length; //문자열 소수점 다음 개수        
      if(decimalN < d)decimalN = d;
    }
  }
  return decimalN;
}
var arr = [0.1, 0.12, 0.123]
decimalFits(arr); // 결과 : 3

Number.isInteger() - 정수인지 확인할 수 있는 메서드

 

 

 

3.  Math. round, ceil, floor ( 반올림, 올림, 내림 )

반올림

Math.round(0.1);  // 결과 : 0
Math.round(0.5);  // 결과 : 1

올림

Math.ceil(0.1);  // 결과 : 1
Math.ceil(0.5);  // 결과 : 1

내림

Math.floor(0.1);  // 결과 : 0
Math.floor(0.5);  // 결과 : 0

연산식을 만들 때 필요한 함수  Math.round, Math.ceil, Math.floor 

 

소수점 셋째 자리에서 반올림해서 둘째 자리까지 나타내려면

Math.round(0.125*100)/100;  //결과 : 0.13

위와 같이 식을 만들면 돼요~

Math.round((0.1+0.2)*100)/100;  // 결과 : 0.3

 

문제 : 0.1+0.2

정답 : 0.30000000000000004

 

정답이지만.. 우리가 원하는 결과 값을 만들기 위해 긴 글을 작성하게 되었네요

 

 

 

문의가 있다면 댓글을 

이 글이 좋았다면 공감 버튼을 눌러주세요 ^^

 

 

 

 

 

 

반응형
블로그 이미지

2j-story

다양한 지식 공유 알림이 입니다

,