Jquery точный расчет

Во-первых, случай произошел: во ParseFloat (сумма / длина) == Parsefloat (7) времени, то выводы ParseFloat (сумма / длина) появилась 6.99999999999

Во-вторых, решение: введение точного расчета файла расслоение плотной, следующим образом:

/ ** 
 * @desc решить проблему с плавающей операции, чтобы избежать потери точности и многоразрядных после десятичной точки. 
 * Пример вопрос: 4.699999999999999,1.0 = 2,3 + 2,4 - 0,9 = 0,09999999999999998 
 * / 
/ ** 
 * неправильные данные регуляризации 
 * Газа (0,09999999999999998) = 0,1 
 * / 
Функция полоса (ДНО, точность) { 
    IF (Precision недействительными === 0) {= 12 Точность;} 
    возвращать parseFloat + (num.toPrecision (точность)); 
} 
/ ** 
 * длина возвратных цифр A Количество 
 * * @param {NUM номер входа Число} 
 * / 
функция digitLength (ДНО) { 
    / / длина цифры для Получить E 
    вар eSplit = num.toString () Сплит (/ [еЕ] /) ;. 
/ ** 
 * превратить в десятичное целое, поддерживая научные обозначения. Если он затем усиливается в десятичное число 
    вар Len = ( '' [. 1] eSplit [0] .split () || '') .length - (+ (eSplit [1] || 0));
    Len возврат> 0 Len :? 0; 
}
 * {* Количество} Num количества входного @param 
 * / 
функция float2Fixed (ДНО) { 
    ЕСЛИ (num.toString (). Когда IndexOf ( 'E') === -1) { 
        возвращает номер вызывающего (num.toString (). Заменить ( , '')); '' 
    } 
    вар DLEN = digitLength (NUM); 
    вернуть DLEN> 0 полосы (NUM * Math.pow (10, DLEN)) :? NUM; 
} 
/ ** 
 * из чисел диапазона обнаружены, если границы строки 
 * * {число} Num количества входного @param 
 * / 
функция checkBoundary (ДНО) { 
    ЕСЛИ (_boundaryCheckingState) { 
        ЕСЛИ (NUM> NUM Number.MAX_SAFE_INTEGER ||  . MIN_SAFE_INTEGER) {< номер по 
    } 
}
            console.warn (Num + «выходит за границы , когда передача целого числа, то результаты могут быть не точными»); 
        }
/ ** 
 *精确乘法
 * / 
раз функции (num1, пит2) { 
    вар другие  
    Вар num1Changed = float2Fixed (num1); 
    вар num2Changed = float2Fixed (пит2); 
    вар baseNum = digitLength (num1) + digitLength (пит2);= [];
    для (вар - i = 2; _i <arguments.length; - i ++) { 
        другие [ - i - 2] = аргументы [ - i];
    } 
    Если (others.length > 0) { 
        вернуть times.apply (0 недействительными, [раз (num1, пит2), другие [0]] CONCAT (others.slice (1)).); 
    } 
    Вар leftValue = num1Changed * num2Changed; 
    checkBoundary (leftValue); 
    вернуть leftValue / Math.pow (10, baseNum); 
} 
/ ** 
 *精确加法
 * / 
Функция плюс (num1, пит2) { 
    вар другие = []; 
    для (вар - i = 2; _i < аргументы .length; ++ _I) { 
        другие [ - i - 2] = аргументы [ - i];
    } 
    Если (others.length > 0) { 
        вернуть plus.apply (0 недействительными, [плюс (num1, пит2), другие [0]] CONCAT (others.slice (1)).); 
    } 
    Вар baseNum = Math.pow (10, Math.max (digitLength (num1), digitLength (пит2))); 
    (возвратные раз (num1, baseNum) + раз (num2, baseNum)) / baseNum;
} 
/ ** 
 *精确减法
 * / 
функция минус (num1, пит2) { 
    вар другие = []; 
    для (вар - i = 2; _i < аргументы .length; ++ _I) { 
        другие [ - i - 2] = аргументы [ - i];
    } 
    Если (others.length > 0) {
        вернуть minus.apply (0 недействительными, [минус (num1, пит2), другие [0]] CONCAT (others.slice (1)).); 
    } 
    Вар baseNum = Math.pow (10, Math.max (digitLength (num1), digitLength (пит2))); 
    (возвратные раз (num1, baseNum) - раз (num2, baseNum)) / baseNum; 
} 
/ ** 
 *精确除法
 * / 
функция деления (num1, num2) { 
    вар другие = [];
    для (вар - i = 2; _i 
    } 
    Вар num1Changed = float2Fixed (num1);< аргументы .length; ++ _I) { 
        другие [ - i - 2] = аргументы [ - i];
    } 
    Если (others.length > 0) { 
        вернуть divide.apply (0 недействительными, [деление (num1, пит2), другие [0]] CONCAT (others.slice (1)).); 
    вар num2Changed = float2Fixed (пит2); 
    checkBoundary (num1Changed); 
    checkBoundary (num2Changed); 
    возвратные раз ((num1Changed / num2Changed), Math.pow (10, digitLength (пит2) - digitLength (num1))); 
} 
/ ** 
 *四舍五入
 * / 
функция округления (число, соотношение) { 
    вар база = Math.pow (10, отношение); 
    вернуться делить (Math.round (раз (NUM, основание)), основание); 
} 
переменный = _boundaryCheckingState истину; 
/ ** 
 * граничные проверяет , является ли открытым по умолчанию 
 * @param флаг переключателя тегов, правда , чтобы открыть , близок к ложному, по умолчанию истинной 
 * / 
функции enableBoundaryChecking (флаг) { 
    ЕСЛИ (в пустоте флага === 0) = {флаг к истинному;} 
    _boundaryCheckingState в Flag =; 
}

 

рекомендация

отwww.cnblogs.com/CherishZeng/p/10963412.html