2012-03-11 29 views
16

puedo convertir grados a radianes (grados * Math.PI/180), pero ¿por qué el siguiente:¿Por qué Math.cos (90 * Math.PI/180) produce 6.123031769111 ... y no cero?

Math.cos(90 * Math.PI/180) 

rendimiento 6.123031769111 ... y no es cero?

Estoy tratando de realizar rotaciones 2D utiliza matrices y los resultados están completamente fuera de control.

+2

Debería mostrar más código para que podamos ver el contexto. – Gabe

+2

@ Gabe- En realidad, el código anterior es suficiente. Intente escribirlo en una consola JS y obtendrá el resultado que se muestra arriba. – templatetypedef

Respuesta

33

La salida del

Math.cos(90 * Math.PI/180) 

es

6.123031769111886e-17 

Aviso la e-17 en el extremo, lo que significa que este número es 6,123 x 10 -17 . Este es un número tan cercano a 0 que efectivamente es 0. La razón por la que no es idénticamente 0 se debe a errores de redondeo en el doble formato IEEE-754 que le impide obtener una representación exacta de π/2 y causa errores de redondeo por minuto en el cálculo del coseno.

Por cierto - ¡Estaba bastante sorprendido también cuando el resultado regresó con un 6! Fue solo después de ver el final que las cosas empezaron a tener sentido.

Espero que esto ayude!

+6

y el hecho de que 'Math.PI! = Π'. –

+3

+1. ¿Tal vez agregar algo como 'Math.cos (90 * Math.PI/180) .toFixed (15)' como una solución simple? –

+0

'' (Math.cos (90 * Math.PI/180) | 0) === 0'' – JCM

2

6.123233995736766e-17 es muy muy cercano a cero. Solo redondea el número.

3
6.123233995736766e-17 

es una notación científica para un número muy pequeño, cercano a cero. No es exactamente cero debido a errores de redondeo, etc.

Cuestiones relacionadas