Red de conocimientos sobre prescripción popular - Remedios caseros - ¿Por qué el resultado de eval("1*0.2 2*0.2 0*0.6 ") está en js 0.600000000001?

¿Por qué el resultado de eval("1*0.2 2*0.2 0*0.6 ") está en js 0.600000000001?

Obtienes 0.6 en IE8 y 0.60000000001 en Chrom y Firefox.

De hecho, esto es un error en las operaciones de punto flotante js. En JavsScript, las variables se almacenan como flotantes en lugar de números. JavaScript utiliza el formato de punto flotante de 64 bits definido por el estándar IEEE 754-2008 para almacenar números. Según la definición de IEEE 754:?

La longitud de la parte plástica correspondiente a decimal64 es 10 y la longitud de la parte decimal es 16, por lo que el resultado del cálculo predeterminado es "7.00000000001". Si el último decimal es 0, entonces 1 se considera un símbolo numérico válido.

Solución: Nota: El siguiente código no es original.

(1).mul(0.2) (2). mul(0.2) 0*0.6

lt script gt

// 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? accAdd(arg1, arg2){

var? r1, r2, m;

Intente {r1=arg1.toString(). split(".")[1].length}catch(e){r1=0}

Intente {r2=arg2.toString(). split(".")[1].length}captura(e){r2=0}

m=Math.pow(10,Math.max(r1,r2))

¿Regresar? (arg1*m arg2*m)/m

}

//Agregue un método add al tipo numérico para que sea más conveniente llamar, similar al siguiente.

Número.prototipo.agregar? =?Función? (Parámetro){

¿Regresión? accAdd(arg, this);

}

Número.prototipo.mul? =?Función? (Parámetro){

¿Regresión? accMul(arg, this);

}

// Función de multiplicación, utilizada para obtener resultados de multiplicación precisos.

//Descripción: El resultado de la multiplicación de JavaScript tendrá errores, que serán más obvios cuando se multipliquen dos números de punto flotante. Esta función devuelve un resultado de multiplicación más preciso.

//Llamada: accMul(arg1, arg2)

//Valor de retorno: arg1 multiplicado por arg2.

¿Función? accMul(arg1, arg2)

{

var? m=0, s1=arg1.toString(), S2 = arg 2. tostring();

Intente {m =s1.split(" . ")[1].length}catch(e ){}

Probar {m =s2.split(" . ")[1].length}catch(e){}

¿Volver? Número(s1.replace(" .," "))*Número(s2.replace(" . "," "))/Math.pow(10, m)

}

Number.prototype.div? =?(parameter){

Return? accDiv(arg, this);

// Función de división, utilizada para obtener resultados de división precisos. /p>

//Descripción: 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, arg2){

var? ? t1=0, t2=0, r1, R2;

Intente {t1=arg1.toString() [1].length}catch(e){}

. Intente {t2=arg2.toString(). split(".")[1].length}catch(e){}

Usar (matemáticas){

r 1. = Número(arg 1 . tostring(). Reemplazar (".", ""))

r2=Número (arg2.toString().Reemplazar(".",""))

¿Regresión? (r1/r2)*pow(10, T2-t 1);

}

}

lt/script gt;