2010-03-19 7 views
6

He visto la siguiente (extraña) función de redondeo de Javascript en algún código heredado. Después de buscar en Google, puedo ver que aparece en varios lugares en línea. Sin embargo, no puedo entender por qué están presentes los valores codificados 8191 y 10485.Hard-coded 8191 10485 valores en la función de redondeo de JavaScript

¿Alguien sabe si hay algún motivo sensato para incluir estos valores? Si no, ¡ojalá podamos acabar con el meme!

function roundNumber(num,dec) { 
    var newnumber = 0; 
    if (num > 8191 && num < 10485) { 
     num = num-5000; 
     newnumber = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec); 
     newnumber = newnumber+5000; 
    } else { 
     newnumber = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec); 
    } 
    return newnumber; 
} 
+1

Prueba extraña o no, esta función no funciona. Intentó 'roundNumber (3000 * Math.PI, 2)'. Use 'Number.prototype.toFixed' en su lugar. – Alsciende

Respuesta

2

8191 (0x1FFF) podría ser significativo en términos de representación binaria, pero 10485 (0x28f5) no parece ser.

Apuesto a que este es un tipo de truco para evitar un error de redondeo de punto flotante percibido. Los números de coma flotante pueden actuar de maneras impredecibles, donde espera 2 pero obtiene 1.99999999973904 en su lugar, por ejemplo, y las comparaciones como> = 2 fallan.

1
function roundNumber(num, dec){ 
var newnumber= 0; 
if(num> 8191 && num < 10485){ 
    num= num-5000; 
    newnumber= Math.round(num*Math.pow(10, dec))/Math.pow(10, dec); 
    newnumber= newnumber+5000; 
} 
else{ 
    newnumber= Math.round(num*Math.pow(10, dec))/Math.pow(10, dec); 
} 
return newnumber; 
} 

¿Estás seguro de que esto era para javascript?

Si usted tiene un número (n = 10449.)

y desea redondear a 5 decimales (DEC = 5), Math.round (n * Math.pow (10, dec))/Math.pow (10, dec) devuelve 10449..

El uso de roundNumber (10449.,5) devuelve 10449., que no parece ser una mejora. 10000.12 devuelto 10000.119999999999.

Fallaron todos los números no enteros que probé en el rango 8191-10485.

10000 devolvió 10000, por lo que puede usarlo con seguridad para redondear enteros, supongo.

+0

Gracias Kennebec - definitivamente es tomado de js source, pero no me sorprende que devuelva basura para ser honesto. Estaba más interesado en por qué los números mágicos están ahí. –