자바 스크립트에서 부동 소수점 정밀도 다루기 [중복]
이 질문에 이미 답변이 있습니다.
y
자바 스크립트에 많은 양의 숫자 값 이 있습니다. 가장 가까운 배수로 반올림하여 그룹화하고 x
결과를 문자열로 변환하고 싶습니다 .
성가신 부동 소수점 정밀도를 어떻게 피할 수 있습니까?
예를 들면 :
0.2 + 0.4 = 0.6000000000000001
내가 시도한 두 가지 :
>>> y = 1.23456789
>>> x = 0.2
>>> parseInt(Math.round(Math.floor(y/x))) * x;
1.2000000000000002
과:
>>> y = 1.23456789
>>> x = 0.2
>>> y - (y % x)
1.2000000000000002
이 게시물에서 : JavaScript에서 부동 소수점 숫자 정밀도를 다루는 방법은 무엇입니까?
몇 가지 옵션이 있습니다.
- decimal.js 와 같은 소수에 특수 데이터 유형을 사용하십시오.
- 결과를 다음과 같이 고정 된 유효 자릿수로 형식화합니다.
(Math.floor(y/x) * x).toFixed(2)
- 모든 숫자를 정수로 변환
다음과 같이 할 수 있습니다.
> +(Math.floor(y/x)*x).toFixed(15);
1.2
> var x = 0.1
> var y = 0.2
> var cf = 10
> x * y
0.020000000000000004
> (x * cf) * (y * cf) / (cf * cf)
0.02
빠른 솔루션 :
var _cf = (function() {
function _shift(x) {
var parts = x.toString().split('.');
return (parts.length < 2) ? 1 : Math.pow(10, parts[1].length);
}
return function() {
return Array.prototype.reduce.call(arguments, function (prev, next) { return prev === undefined || next === undefined ? undefined : Math.max(prev, _shift (next)); }, -Infinity);
};
})();
Math.a = function () {
var f = _cf.apply(null, arguments); if(f === undefined) return undefined;
function cb(x, y, i, o) { return x + f * y; }
return Array.prototype.reduce.call(arguments, cb, 0) / f;
};
Math.s = function (l,r) { var f = _cf(l,r); return (l * f - r * f) / f; };
Math.m = function () {
var f = _cf.apply(null, arguments);
function cb(x, y, i, o) { return (x*f) * (y*f) / (f * f); }
return Array.prototype.reduce.call(arguments, cb, 1);
};
Math.d = function (l,r) { var f = _cf(l,r); return (l * f) / (r * f); };
> Math.m(0.1, 0.2)
0.02
You can check the full explanation here.
Check out this link.. It helped me a lot.
http://www.w3schools.com/jsref/jsref_toprecision.asp
The toPrecision(no_of_digits_required)
function returns a string
so don't forget to use the parseFloat()
function to convert to decimal point of required precision.
Tackling this task, I'd first find the number of decimal places in x
, then round y
accordingly. I'd use:
y.toFixed(x.toString().split(".")[1].length);
It should convert x
to a string, split it over the decimal point, find the length of the right part, and then y.toFixed(length)
should round y
based on that length.
참고URL : https://stackoverflow.com/questions/11695618/dealing-with-float-precision-in-javascript
'Program Tip' 카테고리의 다른 글
sqlalchemy의 선언적 ORM 확장을 사용하는 경우 다중 열 인덱스 (0) | 2020.10.05 |
---|---|
윤년 버그로부터 보호하기 위해 설계된 코딩 관행을 어떻게 개발할 수 있습니까? (0) | 2020.10.05 |
Gradle : 둘 이상의 프로젝트 변형 : myLib이 소비자 속성과 일치합니다. (0) | 2020.10.05 |
누락 된 주석으로 인해 런타임에 ClassNotFoundException이 발생하지 않는 이유는 무엇입니까? (0) | 2020.10.05 |
RESTful API 메서드 (0) | 2020.10.05 |