Книга: JavaScript. Подробное руководство, 6-е издание

3.1.3. Арифметические операции в JavaScript

3.1.3. Арифметические операции в JavaScript

Обработка чисел в языке JavaScript выполняется с помощью арифметических операторов. В число таких операторов входят: оператор сложения +, оператор вычитания -, оператор умножения *, оператор деления / и оператор деления по модулю % (возвращает остаток от деления). Полное описание этих и других операторов можно найти в главе 4.

Помимо этих простых арифметических операторов JavaScript поддерживает более сложные математические операции, с помощью функций и констант, доступных в виде свойств объекта Math:

Math.pow(2,53) // => 9007199254740992: 2 в степени 53
Math.round(.6) // => 1.0: округление до ближайшего целого
Math.ceil(.6)  // => 1.0: округление вверх
Math.floor(.6) // => 0.0: округление вниз
Math.abs(-5)   // => 5: абсолютное значение
Math.max(x,y,z)// Возвращает наибольший аргумент
Math.min(x,y,z)// Возвращает наименьший аргумент
Math.random()  // Псевдослучайное число х, где 0 <= х < 1.0
Math.PI        // пи: длина окружности / диаметр
Math.E         // е: Основание натурального логарифма
Math.sqrt(3)   // Корень квадратный из 3
Math.pow(3, 1/3) // Корень кубический из 3
Math.sin(0)    // Тригонометрия: имеются также Math.cos, Math.atan и другие.
Math.log(10)   // Натуральный логарифм 10
Math.log(100)/Math.LN10 // Логарифм 100 по основанию 10 (десятичный)
Math.log(512)/Math.LN2  // Логарифм 512 по основанию 2
Math.exp(3)    // Math.E в кубе

Полный перечень всех математических функций, поддерживаемых языком JavaScript, можно найти в справочном разделе с описанием объекта Math.

Арифметические операции в JavaScript не возбуждают ошибку в случае переполнения, потери значащих разрядов или деления на ноль. Если результат арифметической операции окажется больше самого большого представимого значения (переполнение), возвращается специальное значение «бесконечность», которое в JavaScript обозначается какInfinity. Аналогично, если абсолютное значение отрицательного результата окажется больше самого большого представимого значения, возвращается значение «отрицательная бесконечность», которое обозначается как -Infinity. Эти специальные значения, обозначающие бесконечность, ведут себя именно так, как и следовало ожидать: сложение, вычитание, умножение или деление бесконечности на любое значение дают в результате бесконечность (возможно, с обратным знаком).

Потеря значащих разрядов происходит, когда результат арифметической операции оказывается ближе к нулю, чем минимально возможное значение. В этом случае возвращается число 0. Если потеря значащих разрядов происходит в отрицательном результате, возвращается специальное значение, известное как «отрицательный ноль». Это специальное значение практически ничем не отличается от обычного нуля, и у программистов на JavaScript редко возникает необходимость выделять его.

Деление на ноль не считается ошибкой в JavaScript: в этом случае просто возвращается бесконечность или отрицательная бесконечность. Однако есть одно исключение: операция деления нуля на ноль не имеет четко определенного значения, поэтому в качестве результата такой операции возвращается специальное значение «не число» (not-a-number), которое обозначается как NaN. Значение NaN возвращается также при попытке разделить бесконечность на бесконечность, извлечь квадратный корень из отрицательного числа или выполнить арифметическую операцию с нечисловыми операндами, которые не могут быть преобразованы в числа.

В JavaScript имеются предопределенные глобальные переменные Infinity и NaN, хранящие значения положительной бесконечности и «не число». В стандарте ECMAScript 3 эти переменные доступны для чтения/записи и могут изменяться в программах. Стандарт ECMAScript 5 исправляет эту оплошность и требует, чтобы эти переменные были доступны только для чтения. Объект Number предоставляет альтернативные представления некоторых значений, доступные только для чтения даже в ECMAScript 3. Например:

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 не равны

Оглавление книги


Генерация: 0.997. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз