2012-03-11 11 views
16

przekonwertować stopni na radiany (stopnie * Math.PI/180), ale dlaczego następuje:Dlaczego Math.cos (90 * Math.PI/180) daje 6,123031769111 ... a nie zero?

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

wydajność +6,123031769111 ... i nie zero?

Próbuję wykonywać obroty 2D za pomocą macierzy, a wyniki są całkowicie nieskuteczne.

+2

Powinieneś pokazać więcej kodu, abyśmy mogli zobaczyć jakiś kontekst. – Gabe

+2

@ Gabe Właściwie powyższy kod jest wystarczający. Spróbuj wpisać go w konsolę JS, a otrzymasz wynik pokazany powyżej. – templatetypedef

Odpowiedz

33

Wyjście

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

jest

6.123031769111886e-17 

Zawiadomienie e-17 na końcu, co oznacza, że ​​liczba ta wynosi 6,123 x 10 -17. Jest to numer tak bliski zeru, że jest efektywny 0. Przyczyna, że ​​nie jest identyczna 0, wynika z błędów zaokrągleń w podwójnym formacie IEEE-754, co uniemożliwia uzyskanie dokładnej reprezentacji π/2 i powoduje błędy zaokrąglania minut w obliczaniu cosinusa.

Przy okazji - byłem również bardzo zaskoczony, gdy wynik powrócił, zaczynając od 6! Dopiero gdy spojrzałem na sam koniec, wszystko zaczęło mieć sens.

Mam nadzieję, że to pomoże!

+6

oraz fakt, że 'Math.PI! = Π'. –

+3

+1. Może dodać coś w stylu 'Math.cos (90 * Math.PI/180) .toFixed (15)' jako proste rozwiązanie? –

+0

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

2

6.123233995736766e-17 jest bardzo blisko zera. Wystarczy zaokrąglić liczbę.

3
6.123233995736766e-17 

jest notacją naukową dla bardzo małej liczby, zbliżonej do zera. Nie jest to dokładnie zero ze względu na błędy zaokrąglania i tak dalej.

Powiązane problemy