1. Calcular con js
12.32 * 7 ¿Cuál es el resultado? Respuesta: 86.24000000000001
¿Por qué ocurre este problema? ¿Cómo solucionarlo?
Hay un error en js al tratar con la multiplicación y división de decimales. La solución puede ser: convertir decimales en números enteros para procesar.
El cálculo anterior se puede cambiar a:
12,32*100*7/100
El resultado es: 86,24, correcto.
También haz algunos cálculos:
8,80*100*12/100
Resultado: 105.60000000000002
Ocurrirán problemas similares con 38.80.
La precisión aumentó 10 veces:
8,80*1000*12/1000
Resultado: 105,6
Es normal.
16,40 * 1000000 * 6 / 1000000
También hay un problema con el resultado.
Para que la ejecución de js sea más precisa, en el futuro cálculo decimal de js, expanda directamente el valor 10,000 veces y luego divídalo por 10,000 para resolver el problema.
varnum = 38,80;
var número2 = 13;
alerta(núm * 10000 * 12/10000);
Se ha probado el número que se va a multiplicar y dividir y se ha descubierto que es 10.000. Si es menor, algunos números causarán problemas. Si es mayor (1.000.000), algunos números también causarán problemas.
dos,
Copie el código de código de la siguiente manera:
<guión aplazado>
Número.prototipo.rate=función(){
varoStr=this.toString();
si(oStr.indexOf(".")==-1)
retorno1;
demás
returnMath.pow(10,parseInt(oStr.length-oStr.indexOf(".")-1));
}
funcióntran(){
args=tran.argumentos;
vartemp=1;
para(i=0;i<args.length;i++)
temp*=args[i]*args[i].rate();
para(i=0;i<args.length;i++)
temp/=args[i].rate();
temperatura de retorno
}
alerta(tran(11,22.9));
</script>
Esta solución es un poco más engorrosa, pero le da una idea del proceso real para resolver este problema.
Copie el código de código de la siguiente manera:
//Función de división, utilizada para obtener resultados de división precisos
// Nota: El resultado de la división de JavaScript tendrá errores, que serán más obvios al dividir dos números de punto flotante. Esta función devuelve un resultado de división más preciso.
// Llamada: accDiv(arg1,arg2)
//Valor de retorno: el resultado exacto de dividir arg1 por arg2
función accDiv(arg1,arg2){
vart1=0,t2=0,r1,r2;
intente{t1=arg1.toString().split(".")[1].length}catch(e){}
intente{t2=arg2.toString().split(".")[1].length}catch(e){}
con(Matemáticas){
r1=Número(arg1.toString().replace(".",""))
r2=Número(arg2.toString().reemplazar(".",""))
devolver (r1/r2)*pow(10,t2-t1);
}
}
//Agregue un método div al tipo Número para que sea más conveniente llamar.
Número.prototipo.div = función (arg){
devolver accDiv(este, arg);
}
// Función de multiplicación, utilizada para obtener resultados de multiplicación precisos
// Nota: El resultado de la multiplicación de JavaScript tendrá errores, que serán más obvios cuando se multipliquen dos números de coma flotante. Esta función devuelve un resultado de multiplicación más preciso.
// Llamada: accMul(arg1,arg2)
//Valor de retorno: el resultado exacto de multiplicar arg1 por arg2
función acumulación(arg1,arg2)
{
var m=0,s1=arg1.toString(),s2=arg2.toString();
intente{m+=s1.split(".")[1].length}catch(e){}
prueba{m+=s2.split(".")[1].length}catch(e){}
devolver Número(s1.replace(".",""))*Número(s2.replace(".",""))/Math.pow(10,m)
}
// Agregue un método mul al tipo Número para que sea más conveniente llamar.
Número.prototipo.mul = función (arg){
return acumulación(arg, this);
}
//Función de suma, utilizada para obtener resultados de suma precisos
// Nota: El resultado de la suma de JavaScript tendrá errores, que serán más obvios al sumar dos números de punto flotante. Esta función devuelve un resultado de suma más preciso.
// Llamada: accAdd(arg1,arg2)
// Valor de retorno: el resultado exacto de arg1 más arg2
función agregar(arg1,arg2){
varr1,r2,m;
intente{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
intente{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2))
retorno (arg1*m+arg2*m)/m
}
//Agregue un método add al tipo Número para que sea más conveniente llamar.
Número.prototipo.add = función (arg){
return accAdd(arg,this);
}