Во-первых, случай произошел: во 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 =; }