JS 정밀도 소수점 곱셈과 나눗셈 알고리즘 용액 부동

문제가 발생하기 쉬운 때 JS 정밀도 부동 소수점 연산

1) 나눗셈 기능

// 참고 : 분할 결과, 두 개의 부동 소수점 부문은 더 명백 할 것이다 자바 스크립트 오류가있을 것입니다. 이 기능은 분할의 결과가 더 정확 반환합니다. 
// 전화 : accDiv (ARG1, ARG2)의 
반환 값 : // ARG1 분할의 정확한 결과 ARG2 


함수 accDiv (ARG1, ARG2) { 
    T2 = 0, R1, R2 var에 T1 = 0; 
    은 try {T1 = arg1.toString을 () .split를 "." [1] .length} 캐치 (E) {} // - 소수점 길이
    . "."시도 { T2 = arg2.toString () 분할 [1] .length } 캐치 (전자) {} // - 소수점 후 길이
    (수학)와 { 
      R1은 = 번호는 (arg1.toString는 () ")." "(교체".) // - 정수 제거 소수점
      R2 = 번호 (arg2.toString (. "." // -)) ","(대체) 정수 소수점 제거
      창 (R1 / R2) * POW (10, T2-T1)] // --- 정수 나눗셈 10 진수의 길이의 제곱을 곱한
    } 


2) 승산 기능

// 설명 : 오류가있을 것입니다 자바 스크립트 곱셈 결과 때 두 개의 부동 소수점 곱셈 더 분명. 이 기능은보다 정확한 곱셈 결과를 반환합니다. 
// 전화 : accMul (ARG1, ARG2)의 
값을 리턴 // : 정확한 결과 ARG1 승산 ARG2 
함수 accMul (ARG1, ARG2) { 
    VAR의 m = 0, S1 = arg1.toString을 (), S2 = arg2.toString ()를 ] 
    은 try {[. 1] m + = s1.split ( ".")} 캐치 (E) {} .length 
    은 try {[. 1] m + = s2.split ( ".")} 캐치 (E) {.length} 
    리턴 번호 (s1.replace ( ".", "")) * 번호 (s2.replace ( ".", "")) / Math.pow (10 m) 


3) 또한 함수

// 설명 : 두 개의 부동 소수점 더 분명 추가 할 때 가산 결과는, 오류가 될 것입니다 자바 스크립트. 이 기능은보다 정확한 또한의 결과를 반환합니다. 
// 전화 : accAdd (ARG1, ARG2)의 
반환 값 : // 첨가 정확한 결과 ARG1에 ARG2 
기능 accAdd (ARG1, ARG2) { 
    VAR R1, R2, m을, 
    은 try {R1 = () 스플릿 ( "Arg1.toString. . ")는 [. 1]} 캐치 (E) R1 = {0} .length 
    ."). 1]} 캐치 .length (E) R2 = {0} {시도 arg2.toString R2 = (). 스플릿 ( " 
    m을 Math.pow = (10 Math.max (R1, R2)) 
    창 (ARG1에 ARG2 * m +에서의 m) / m 

4) 감산 기능

함수 accSub (ARG1, ARG2) { 
       VAR의 R1, R2, m, n은; 
       R1 = {arg1.toString ()를. 분리 "."[1] .length} 시도 캐치 (E) {R1 = 0} 
       {시도 arg2.toString R2 = (). 분할 "."[1] .length} 캐치 (E) {R2 = 0} 
       m = Math.pow (10 Math.max (R1, R2)); 
       deeka 마지막으로 수정 // 
       //动态控制精度长度 
       N = (R1> R2 =) R1 : R2; 
       창 ((ARG1에 * m-ARG2에 *를 m) / M)이 (N) .toFixed; 
}

추천

출처www.cnblogs.com/tongshuangxiong/p/11200899.html