Program Tip

자바 스크립트에서 부동 소수점 정밀도 다루기

programtip 2020. 10. 5. 20:38
반응형

자바 스크립트에서 부동 소수점 정밀도 다루기 [중복]


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

반응형