>  기사  >  웹 프론트엔드  >  js 덧셈, 뺄셈, 곱셈 및 Division_javascript 기술의 정밀도 손실 문제에 대한 솔루션

js 덧셈, 뺄셈, 곱셈 및 Division_javascript 기술의 정밀도 손실 문제에 대한 솔루션

WBOY
WBOY원래의
2016-05-16 16:48:101396검색

JavaScript에서는 덧셈, 뺄셈, 곱셈, 나눗셈에 소수를 사용할 때 결과 뒤에 소수의 긴 마침표가 나오는 경우가 있는데, 이는 연산을 복잡하게 하고 계산 결과에 영향을 줍니다. 그 이유를 온라인에서 찾아보니 다음과 같습니다. JavaScript에서는 소수로 데이터를 계산할 때 항상 소수점 자리가 많이 있습니다. 이는 JavaScript의 부동 소수점 계산이 이진 계산을 기반으로 하기 때문입니다.

코드 복사 코드는 다음과 같습니다.

/**
* 데이터에 소수점을 추가한 후 여러 자릿수 및 계산 정확도 손실을 방지하기 위한 추가 작업입니다.
*
* @param num1 addend 1 | num2 addend 2
*/
function numAdd(num1, num2) {
var baseNum, baseNum1, baseNum2;
try {
baseNum1 = num1.toString().split(".")[1].length; >} catch (e) {
baseNum1 = 0;
}
try {
baseNum2 = num2.toString().split(".")[1].length; catch (e ) {
baseNum2 = 0;
}
baseNum = Math.pow(10, Math.max(baseNum1, baseNum2))
return (num1 * baseNum num2 * baseNum) / baseNum;
};
/**
* 데이터의 소수점 추가 후 여러 자릿수 및 계산 정확도 손실을 방지하기 위한 추가 작업입니다.
*
* @param num1 minuend
*/
function numSub(num1, num2) {
var baseNum, baseNum1, baseNum2; >try {
baseNum1 = num1.toString().split(".")[1].length;
} catch (e) {
baseNum1 = 0
}
try {
baseNum2 = num2.toString().split(".")[1].length;
} catch(e) {
baseNum2 = 0
}
baseNum = 수학 .pow( 10, Math.max(baseNum1, baseNum2));
precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2
return ((num1 * baseNum - num2 * baseNum) / baseNum). toFixed(정밀도 );
};
/**
* 데이터에 소수점을 곱한 후 여러 자릿수 및 계산 정확도 손실을 방지하기 위한 곱셈 연산입니다.
*
* @param num1 피승수 num2 승수
*/
function numMulti(num1, num2) {
var baseNum = 0
try {
baseNum = num1.toString ().split(".")[1].length;
} catch (e) {
}
try {
baseNum = num2.toString().split(" .") [1].length;
} catch (e) {
}
return Number(num1.toString().replace(".", "")) * Number(num2.toString) ().replace(".", "")) / Math.pow(10, baseNum)
/**
* 데이터를 소수점으로 나눈 후 여러 자릿수 및 계산 정확도 손실을 방지하기 위한 나눗셈 연산입니다.
*
* @param num1 배당수 num2 제수
*/
function numDiv(num1, num2);
var baseNum1 = 0, baseNum2 = 0;
var baseNum3, baseNum4
try {
baseNum1 = num1.toString().split(".")[1].length; >} catch (e) {
baseNum1 = 0;
}
try {
baseNum2 = num2.toString().split(".")[1].length; catch (e ) {
baseNum2 = 0;
}
with (Math) {
baseNum3 = Number(num1.toString().replace(".", "")); >baseNum4 = Number(num2.toString().replace(".", ""));
return (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1)
}
};

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.