Infinity // Переменная, доступная для чтения/записи,
// инициализированная значением Infinity.
Number.POSITIVE_INFINITY // То же значение, доступное только для чтения.
1/0 // То же самое значение.
Number.MAX_VALUE + 1 // Это выражение также возвращает Infinity.
Number.NEGATIVE_INFINITY // Возвращают отрицательную бесконечность.
-Infinity
-1/0
-Number.MAX_VALUE - 1
NaN // Переменная, доступная для чтения/записи,
// инициализированная значением NaN.
Number.NaN // Свойство, доступное только для чтения, с тем же значением.
0/0 // Возвращает NaN.
Number.MIN_VALUE/2 // Потеря значащих разрядов: возвращает 0
-Number.MIN_VALUE/2 // Отрицательный ноль
-1/Infinity // Также отрицательный ноль
-0
Значение «не число» в JavaScript обладает одной необычной особенностью: операция проверки на равенство всегда возвращает отрицательный результат, даже если сравнить его с самим собой. Это означает, что нельзя использовать проверку х == NaN
, чтобы определить, является значение переменной х
значением NaN
. Вместо этого следует выполнять проверку х != х
. Эта проверка вернет true
тогда и только тогда, когда х
имеет значение NaN
. Аналогичную проверку можно выполнить с помощью функции isNaN()
. Она возвращает true
, если аргумент имеет значение NaN
или если аргумент является нечисловым значением, таким как строка или объект. Родственная функция isFinite()
возвращает true
, если аргумент является числом, отличным от NaN
, Infinity
или -Infinity
.
Отрицательный ноль также имеет свои характерные особенности. В операциях сравнения (даже в операции строгой проверки на равенство) он признается равным положительному нулю, что делает эти два значения практически неотличимыми, за исключением случаев, когда они выступают в роли делителей:
var zero = 0; // Обычный ноль
var negz = -0; // Отрицательный ноль
zero === negz // => true: ноль и отрицательный ноль равны
1/zero === 1/negz // => false: Infinity и -Infinity не равны
3.1.4. Двоичное представление вещественных чисел и ошибки округления
Вещественных чисел существует бесконечно много, но формат представления вещественных чисел в JavaScript позволяет точно выразить лишь ограниченное их количество (точнее, 18437736874454810627). Это значит, что при работе с вещественными числами в JavaScript представление числа часто будет являться округлением фактического числа.
Стандарт представления вещественных чисел IEEE-754, используемый в JavaScript (и практически во всех других современных языках программирования), определяет двоичный формат их представления, который может обеспечить точное представление таких дробных значений, как 1/2, 1/8 и 1/1024. К сожалению, чаще всего мы пользуемся десятичными дробями (особенно при выполнении финансовых расчетов), такими как 1/10,1/100 и т. д. Двоичное представление вещественных чисел неспособно обеспечить точное представление таких простых чисел, как 0.1.
Точность представления вещественных чисел в JavaScript достаточно высока и позволяет обеспечить очень близкое представление числа 0.1. Но тот факт, что это число не может быть представлено точно, может приводить к проблемам. Взгляните на следующий фрагмент:
var х = .3 - .2; // тридцать копеек минус двадцать копеек
var у = .2 - .1; // двадцать копеек минус 10 копеек
x == y; // => false: получились два разных значения
X == .1 // => false: .3-.2 не равно .1
У == .1 // => true: .2-.1 равно .1
Из-за ошибок округления разность между аппроксимациями чисел .3 и .2 оказалась не равной разности между аппроксимациями чисел .2 и .1. Важно понимать, что эта проблема не является чем-то характерным для JavaScript: она проявляется во всех языках программирования, где используется двоичное представление вещественных чисел. Кроме того, обратите внимание, что значения х и у в примере выше очень близки друг к другу и к истинному значению. Точность округления вполне приемлема для большинства применений: проблема возникает лишь при попытках проверить значения на равенство.
Читать дальше
Конец ознакомительного отрывка
Купить книгу