Escrito en las palabras anteriores:
Hoy ayudé a mi colega a resolver un problema, que es que hay muchos lugares decimales que aparecen al multiplicar decimales. He encontrado este problema antes, así que lo resumiré específicamente;
Tipo de número:
El tipo de número es el tipo más utilizado y más interesante en ECMAScript; Este tipo usa el formato IEEE754 para representar enteros y valores de punto flotante (los valores de punto flotante también son valores de doble precisión en algunos idiomas). Para admitir varios tipos de datos, ECMA-262 define diferentes formatos de superficie numérica.
Decimal:
var intnum = 10; //Entero
Octal:
var octalnum1 = 070; // octal 56
var octalnum2 = 079; // Valor octal inválido resuelto como 79
Los literales octales no son válidos en modo estricto;
Hexadecimal:
var hexnum1 = 0xa; // 10
Recuerde: al realizar operaciones, todos los valores expresados en octal y hexadecimal finalmente se convierten en decimal;
¿Por qué el funcionamiento de los decimales tiene errores?
El mayor progreso de un valor de punto flotante es un decimal de 17 dígitos, pero su precisión es mucho menor que la de un entero al realizar operaciones; Los enteros se convertirán en decimal al realizar operaciones; y al calcular las operaciones decimales en Java y JavaScript, los decimales decimales se convertirán primero en el binario correspondiente, y algunos decimales no pueden convertirse completamente en binario, por lo que el primer error ocurre aquí. Después de que todos los decimales se convierten en binario, las operaciones binarias se realizan para obtener el resultado binario. Luego convierta el resultado binario en decimal, y el segundo error generalmente ocurre aquí.
Entonces (0.1+0.2)! = 03
Solución:
Código de programa
Función de división para obtener resultados de división precisos
Nota: Habrá errores en el resultado de la división de JavaScript, que será más obvio al dividir dos números de puntos flotantes. Esta función devuelve un resultado de división más preciso.
Llame: Accdiv (Arg1, Arg2)
Valor de retorno: el resultado exacto de Arg1 dividido por Arg2
función accDiv (arg1, arg2) {var t1 = 0, t2 = 0, r1, r2; Pruebe {t1 = arg1.ToString (). Split (".") [1] .Length} Catch (e) {} try {t2 = arg2.ToString (). Split (".") [1] .length} capt (e) {} con (matemáticas) {r1 = number (arg1.tostring (). reemplazar ("." ",")))) r2 = número (arg2.ToString (). reemplazar (".", ")) return (r1/r2)*pow (10, t2-t1);}}Agregar un método Div al tipo de número es más conveniente de llamar.
Número.prototype.div = function (arg) {return accDiv (this, arg); }Función de multiplicación para obtener resultados de multiplicación precisos
Nota: Habrá errores en el resultado de multiplicación de JavaScript, que será más obvio al multiplicar dos números de puntos flotantes. Esta función devuelve un resultado de multiplicación más preciso.
Llame: Accmul (Arg1, Arg2)
Valor de retorno: el resultado exacto de Arg1 multiplicado por Arg2
función accMul (arg1, arg2) {var m = 0, s1 = arg1.ToString (), s2 = arg2.ToString (); Prueba {m+= s1.split (".") [1] .length} catch (e) {} try {m+= s2.split (".") [1] .length} catch (e) {} número de retorno (s1.replace (".", ")*Número (s2.replace (". "))Agregar un método MUL al tipo de número es más conveniente para llamar.
Número.prototype.mul = function (arg) {return accMul (arg, this);}Función de adición para obtener resultados de adición precisos
Nota: Habrá errores en el resultado adicional de JavaScript, que será más obvio al agregar dos números de puntos flotantes. Esta función devuelve un resultado de adición más preciso.
Llame: Accadd (Arg1, Arg2)
Valor de retorno: el resultado exacto de arg1 más arg2
función acadd (arg1, arg2) {var r1, r2, m; Pruebe {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}Agregue un método Agregar al tipo de número, por lo que es más conveniente llamar.
Número.prototype.add = function (arg) {return accadd (arg, this);}Incluya estas funciones donde desea usar y luego llámelo para calcular.
Por ejemplo, si desea calcular: 7*0.8, entonces cámbielo a (7) .mul (8)
Otras operaciones son similares y se pueden obtener resultados más precisos.
Solución 2:
Los métodos más utilizados, los métodos tofixed () y tofixed () pueden redondear el número en números con un número decimal especificado. Agregar este método después de los resultados de nuestro cálculo está bien; Pero tendrá un ligero impacto en la precisión. Si los requisitos de precisión no son altos, se recomienda usarlo;