Написано в предыдущих словах:
Сегодня я помог моему коллеге решить проблему, которая заключается в том, что есть много десятичных мест, которые появляются при умножении десятичных дел. Я сталкивался с этой проблемой раньше, поэтому я подведу ее специально;
Тип числа:
Тип числа является наиболее часто используемым и наиболее интересным типом в Ecmascript; Этот тип использует формат IEEE754 для представления целых чисел и значений с плавающей точкой (значения с плавающей точкой также являются значениями с двойной задачей на некоторых языках). Чтобы поддержать различные типы данных, ECMA-262 определяет различные численные форматы поверхности.
Десятичный:
var intnum = 10; // целое число
Восьмиугольник:
var octalnum1 = 070; // окт 56
var octalnum2 = 079; // недействительный восьмиугольный ресурс, разрешенный как 79
Октальные литералы недействительны в строгом режиме;
шестнадцатеричный:
var hexnum1 = 0xa; // 10
Помните: при выполнении операций все значения, выраженные в восьмой и шестнадцатеричной, в конечном итоге преобразуются в десятичное значение;
Почему операция десятичных десятиц имеет ошибки?
Самый высокий прогресс значения с плавающей точкой-17-значная десятичная, но его точность гораздо меньше, чем у целого числа при выполнении операций; Целые числа будут преобразованы в десятичное значение при выполнении операций; И при расчете десятичных операций в Java и JavaScript десятичные десятичные десятичные знаки сначала будут преобразованы в соответствующий бинарный, а некоторые десятичные десятичные ткви не могут быть полностью преобразованы в двоичный, поэтому здесь возникает первая ошибка. После того, как все десятичные десятицы преобразуются в двоичный, тогда бинарные операции выполняются для получения бинарного результата. Затем преобразуйте двоичный результат в десятичный, и здесь обычно возникает вторая ошибка.
Итак (0,1+0,2)! = 03
Решение:
Программный код
Функция деления для получения точных результатов деления
Примечание. В результате JavaScript будут ошибки, которые будут более очевидны при разделении двух номеров с плавающей запятой. Эта функция возвращает более точный результат деления.
Звоните: Accdiv (arg1, arg2)
Возвратное значение: точный результат arg1, разделенного на Arg2
функция accdiv (arg1, arg2) {var t1 = 0, t2 = 0, r1, r2; try {t1 = arg1.toString (). split (".") [1] .length} catch (e) {} try {t2 = arg2.tostring (). split (".") [1] .length} catch (e) {} с (математикой) {r1 = число (arg1.tostring (). r2 = number (arg2.toString (). заменить (".", ")) return (r1/r2)*pow (10, t2-t1);}}Добавление метода DIV к типу номера удобнее для вызова.
Number.prototype.div = function (arg) {return accdiv (this, arg); }Функция умножения для получения точных результатов умножения
ПРИМЕЧАНИЕ. В результате умножения JavaScript будут ошибки, что будет более очевидным при умножении двух номеров с плавающей запятой. Эта функция возвращает более точный результат умножения.
Звонок: accmul (arg1, arg2)
Возвращение значения: точный результат arg1, умноженного на arg2
функция accmul (arg1, arg2) {var m = 0, s1 = arg1.toString (), s2 = arg2.toString (); try {m+= s1.split (".") [1] .length} catch (e) {} try {m+= s2.split (".") [1] .length} catch (e) {} return number (s1.replace (".", "))*номер (s2.replace ("., ",", ")))/Math.pow (10, M.))))).Добавление метода MUL к типу номера удобнее для вызова.
Number.prototype.mul = function (arg) {return accmul (arg, this);}Функция добавления для получения точных результатов добавления
ПРИМЕЧАНИЕ. В результате JavaScript будут ошибки, которые будут более очевидны при добавлении двух номеров с плавающей запятой. Эта функция возвращает более точный результат добавления.
Звоните: Accadd (arg1, arg2)
Возвратное значение: точный результат Arg1 Plus Arg2
function Acadd (arg1, arg2) {var r1, r2, m; try {r1 = arg1.toString (). split (".") [1] .length} catch (e) {r1 = 0} try {r2 = arg2.toString (). split (".") [1] .length} catch (e) {r2 = 0} m = math.pow (10, math.max (r1, r2). (arg1*m+arg2*m)/m}Добавьте метод добавления в тип номера, что делает его более удобным для вызова.
Number.prototype.add = function (arg) {return accadd (arg, this);}Включите эти функции, где вы хотите использовать, а затем вызовите их для расчета.
Например, если вы хотите рассчитать: 7*0,8, то измените его на (7) .mul (8)
Другие операции аналогичны, и более точные результаты могут быть получены.
Решение 2:
Более часто используемые методы, методы toFixed () и toFixed () могут округлить числа в числа с указанным десятичным числом. Добавление этого метода после наших результатов расчета в порядке; Но это окажет небольшое влияние на точность. Если требования к точности не высоки, рекомендуется его использовать;