number - parselong javascript
JavaScript agregando nĂºmeros decimales (4)
Este es un problema común con los puntos flotantes.
Use para toFixed
en combinación con parseFloat
.
Aquí hay un ejemplo en JavaScript.
Esta pregunta ya tiene una respuesta aquí:
- ¿Las matemáticas de punto flotante están rotas? 20 respuestas
Así que estoy haciendo una secuencia de comandos que agrega dos números (números decimales) juntos, que he encontrado un problema.
http://jsfiddle.net/DerekL/esqnC/
Hice el guión, resulta bastante bueno:
0.1 + 0.5 //0.6
0.2 + 0.3 //0.5
Pero pronto veo:
0.1 + 0.2 //0.30000000000000004
0.01 + 0.06 //0.06999999999999999
Y no me parece bien. Sé que es un defecto utilizar el punto de flotación con bits finitos, pero no puedo encontrar la forma de solucionarlo.
Math.ceil //No
Math.floor //No
.slice //No
ACTUALIZAR
¿Es posible multiplicar primero los números por 1000, luego agregarlos y luego dividirlos por 1000?
Use para toFixed
para convertirlo en una cadena con algunos lugares decimales recortados, y luego convertirlo de nuevo a un número.
+(0.1 + 0.2).toFixed(12) // 0.3
Parece que IE toFixed
tiene un comportamiento extraño, por lo que si necesitas soportar IE algo así podría ser mejor:
Math.round((0.1 + 0.2) * 1e12) / 1e12
function add(){
var first=parseFloat($("#first").val());
var second=parseFloat($("#second").val());
$("#result").val(+(first+second).toFixed(2));
}
Probando este Javascript:
var arr = [1234563995.721, 12345691212.718, 1234568421.5891, 12345677093.49284];
var sum = 0;
for( var i = 0; i < arr.length; i++ ) {
sum += arr[i];
}
alert( "fMath(sum) = " + Math.round( sum * 1e12 ) / 1e12 );
alert( "fFixed(sum) = " + sum.toFixed( 5 ) );
Conclusión
No use Math.round( (## + ## + ... + ##) * 1e12) / 1e12
En su lugar, use ( ## + ## + ... + ##).toFixed(5) )
En IE 9, toFixed
funciona muy bien.