Jestem pod wrażeniem, że wartości liczbowe są przechowywane jako punkty pływające. Porównywanie pływaków do równości w każdym innym języku jest niewiarygodne i nie zalecane. Czy istnieje jakaś magia, która dzieje się za kulisami, aby ta praca była niezawodnie za to, co w przeciwnym razie byłyby liczbami całkowitymi? Nie mogę znaleźć żadnych innych odniesienia do tego.

0
Matty 10 październik 2011, 08:08

4 odpowiedzi

Najlepsza odpowiedź

Jesteś poprawny o liczbach w języku JS. Sekcja 4.3.19 o specyfikacji językowej mówi

wartość liczbowa

Prymitywna wartość odpowiadająca podwójnie precyzyjnie 64-bitowym formacie binarnym IEEE 754.

Porównanie pływających punktów dla liczb całkowitych działa dobrze. 64B IEEE-754 może dokładnie reprezentować dowolną liczbę całkowitą o wielkości mniejszą niż 2 do 53rd mocy (patrz Ulp ). Problem pojawia się po podziale lub użyciu Math funkcji, które muszą przybliżać wyniki.

Jeśli potrzebujesz zmęczyć wynik z działalności pływającej do najbliższej liczby całkowitej, użyj {X0}}.

"Co każdy komputer powinien wiedzieć o pływającym punkcie" ma dobrą dyskusję na temat błędu zaokrąglania.

2
Community 20 czerwiec 2020, 09:12

Problem polega na tym, że nie może reprezentować pewnych liczb całkowitych, które są zbyt duże,

Dla liczb całkowitych [-900719254740992, 90071992440992] (2 ^ 53) jest dopuszczalny zakres do dokładności.

0
lostyzd 10 październik 2011, 04:19

Magia: parseInt(5) === 5; // true

ECMAScript ma następujące typy danych: Undefined, Null, Boolean, Ciąg, numer i obiekt. (Todo: Wyjaśnij system typu ECMascript - patrz Również część X - typy w: http://www.cs.brown.edu/ ~ SK / Publikacje / Książki / ProgLangs / PDF / all.pdf i http://c2.com/cgi/wiki?categoryLangueGetyping)

Numery ECMascript to 64-bitowe binarne numery zmiennoprzecinkowe. (Dla Szczegóły Zobacz [ECMA-262]). Spidermonkey używa (Type-) Tagged Data wartości. Liczby całkowite ∈ [-2 ^ (słomy-1-1), 2 ^ (słomy-1-1 [mogą być przechowywane bezpośrednio w jsval (bitowy przesuwany i oznaczony). Inne numery ecmascript. są przechowywane pośrednio w podwójnej precyzyjnej liczbie punktowej ( Jsval przechowuje oznaczony wskaźnik do podwójnego). Nagrody ∈ [-2 ^ 53,2 ^ 53] Może być przechowywany dokładnie w podwójnym. 1

[1] Co każdy naukowiec powinien wiedzieć Arytmetyka floating (wersja edytowana)

0
alanc 13 październik 2012, 05:03

Jeśli wiesz, że liczby, które porównujesz, są liczbami całkowitymi, raczej konwertuj je na liczbę całkowitą (na przykład, jeśli są dostępne jako łańcuchy, a następnie użyj parseInt(value)), a następnie porównaj je jako same liczby całkowite.

-2
Saket 10 październik 2011, 04:12