오랜만에 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
정답이지만.. 우리가 원하는 결과 값을 만들기 위해 긴 글을 작성하게 되었네요
문의가 있다면 댓글을
이 글이 좋았다면 공감 버튼을 눌러주세요 ^^
'일상 > ' 카테고리의 다른 글
7세 남자아이 헤어스타일 (0) | 2021.06.21 |
---|---|
JavaScript 자바스크립트 switch 조건문와 if else if 차이점 (0) | 2020.03.19 |