Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 18 additions & 18 deletions 1-js/4-data-structures/2-number/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
alert( 0xFF ); // 255 в шестнадцатиричной системе
```

Также доступна запись в *"научном формате"* (ещё говорят "запись с плавающей точкой"), который выглядит как `<число>e<кол-во нулей>`.
Также доступна запись в *"научном формате"* (ещё говорят "запись с плавающей точкой"), который выглядит как `<число>e<количество нулей>`.

Например, `1e3` -- это `1` с `3` нулями, то есть `1000`.

Expand All @@ -36,7 +36,7 @@ alert( 3e-5 ); // 0.00003 <-- 5 нулей, включая начальный

Как правило, ошибка в программе... Во всяком случае, в большинстве языков программирования это именно так.

Но создатель JavaScript решил пойти математически правильным путем. Ведь чем меньше делитель, тем больше результат. При делении на очень-очень маленькое число должно получиться очень большое. В математическом анализе это описывается через [пределы](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B4%D0%B5%D0%BB_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)), и если подразумевать предел, то в качестве результата деления на `0` мы получаем "бесконечность", которая обозначается символом `∞` или, в JavaScript: `"Infinity"`.
Но создатель JavaScript решил пойти математически правильным путем. Ведь чем меньше делитель, тем больше результат. При делении на очень-очень маленькое число должно получиться очень большое. В математическом анализе это описывается через [пределы](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B4%D0%B5%D0%BB_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)), и если подразумевать предел, то в качестве результата деления на `0` мы получаем "бесконечность", которая обозначается символом `∞` (в JavaScript `Infinity`).

```js run
alert( 1 / 0 ); // Infinity
Expand Down Expand Up @@ -79,7 +79,7 @@ alert( 0 / 0 ); // NaN

Значение `NaN` используется для обозначения математической ошибки и обладает следующими свойствами:

- Значение `NaN` -- единственное, в своем роде, которое *не равно ничему, включая себя*.
- Значение `NaN` -- единственное в своем роде, которое *не равно ничему, включая себя*.

Следующий код ничего не выведет:

Expand Down Expand Up @@ -122,14 +122,14 @@ if (n !== n) alert( 'n = NaN!' );
```smart header="Математические операции в JS безопасны"
Никакие математические операции в JavaScript не могут привести к ошибке или "обрушить" программу.

В худшем случае, результат будет `NaN`.
В худшем случае результат будет `NaN`.
```

## isFinite(n)

Итак, в JavaScript есть обычные числа и три специальных числовых значения: `NaN`, `Infinity` и `-Infinity`.

Тот факт, что они, хоть и особые, но -- числа, демонстрируется работой оператора `+`:
Тот факт, что они, хоть и особые, но числа, демонстрируется работой оператора `+`:

```js run
var value = prompt("Введите Infinity", 'Infinity');
Expand All @@ -141,7 +141,7 @@ var number = +value;
alert( number ); // Infinity, плюс преобразовал строку "Infinity" к такому "числу"
```

Обычно если мы хотим от посетителя получить число, то `Infinity` или `NaN` нам не подходят. Для того, чтобы отличить "обычные" числа от таких специальных значений, существует функция `isFinite`.
Обычно если мы хотим от посетителя получить число, то `Infinity` или `NaN` нам не подходят. Для того чтобы отличить "обычные" числа от таких специальных значений, существует функция `isFinite`.

**Функция `isFinite(n)` преобразует аргумент к числу и возвращает `true`, если это не `NaN/Infinity/-Infinity`:**

Expand All @@ -155,7 +155,7 @@ alert( isFinite(NaN) ); // false

Большинство арифметических операций и математических функций преобразуют значение в число автоматически.

Для того, чтобы сделать это явно, обычно перед значением ставят унарный плюс `'+'`:
Для того чтобы сделать это явно, обычно перед значением ставят унарный плюс `'+'`:

```js run
var s = "12.34";
Expand Down Expand Up @@ -185,7 +185,7 @@ alert( '12.34' / "-2" ); // -6.17

## Мягкое преобразование: parseInt и parseFloat

В мире HTML/CSS многие значения не являются в точности числами. Например, метрики CSS: `10pt` или `-12px`.
В мире HTML/CSS многие значения не являются в точности числами. Например метрики CSS: `10pt` или `-12px`.

Оператор `'+'` для таких значений возвратит `NaN`:

Expand Down Expand Up @@ -224,7 +224,7 @@ alert( parseInt('FF', 16) ); // 255

Для проверки строки на число можно использовать функцию `isNaN(str)`.

Она преобразует строку в число аналогично `+`, а затем вернёт `true`, если это `NaN`, т.е. если преобразование не удалось:
Она преобразует строку в число аналогично `+`, а затем вернёт `true`, если это `NaN`, то есть если преобразование не удалось:

```js run
var x = prompt("Введите значение", "-11.5");
Expand Down Expand Up @@ -260,16 +260,16 @@ function isNumeric(n) {

- Функция `isFinite(n)` преобразует аргумент к числу и возвращает `true`, если это не `Infinity/-Infinity/NaN`.

Таким образом, правая часть отсеет заведомо не-числа, но оставит такие значения как `true/false/null` и пустую строку `''`, т.к. они корректно преобразуются в числа.
Таким образом, правая часть отсеет заведомо не-числа, но оставит такие значения как `true/false/null` и пустую строку `''`, так как они корректно преобразуются в числа.
- Для их проверки нужна левая часть. Вызов `parseFloat(true/false/null/'')` вернёт `NaN` для этих значений.

Так устроена функция `parseFloat`: она преобразует аргумент к строке, т.е. `true/false/null` становятся `"true"/"false"/"null"`, а затем считывает из неё число, при этом пустая строка даёт `NaN`.
Так устроена функция `parseFloat`: она преобразует аргумент к строке, то есть `true/false/null` становятся `"true"/"false"/"null"`, а затем считывает из неё число, при этом пустая строка даёт `NaN`.

В результате отсеивается всё, кроме строк-чисел и обычных чисел.

## toString(система счисления)

Как показано выше, числа можно записывать не только в 10-чной, но и в 16-ричной системе. Но бывает и противоположная задача: получить 16-ричное представление числа. Для этого используется метод `toString(основание системы)`, например:
Как показано выше, числа можно записывать не только в 10-ричной, но и в 16-ричной системе. Но бывает и противоположная задача: получить 16-ричное представление числа. Для этого используется метод `toString(основание системы)`, например:

```js run
var n = 255;
Expand Down Expand Up @@ -389,7 +389,7 @@ alert( price.toFixed(1) ); // 6.3
alert( Math.round(price * 10) / 10 ); // 6.4
```

Как видно, результат разный! Вариант округления через `Math.round` получился более корректным, так как по общепринятым правилам `5` округляется вверх. А `toFixed` может округлить его как вверх, так и вниз. Почему? Скоро узнаем!
Как видно результат разный! Вариант округления через `Math.round` получился более корректным, так как по общепринятым правилам `5` округляется вверх. А `toFixed` может округлить его как вверх, так и вниз. Почему? Скоро узнаем!
````

## Неточные вычисления
Expand Down Expand Up @@ -438,7 +438,7 @@ alert( 0.1.toFixed(20) ); // 0.10000000000000000555
alert( (0.1 * 10 + 0.2 * 10) / 10 ); // 0.3
```

Это работает, т.к. числа `0.1*10 = 1` и `0.2*10 = 2` могут быть точно представлены в двоичной системе.
Это работает, так как числа `0.1*10 = 1` и `0.2*10 = 2` могут быть точно представлены в двоичной системе.
2. Сложить, а затем округлить до разумного знака после запятой. Округления до 10-го знака обычно бывает достаточно, чтобы отсечь ошибку вычислений:

```js run
Expand Down Expand Up @@ -483,13 +483,13 @@ JavaScript предоставляет базовые тригонометрич
: Возвращает угол до точки `(y, x)`. Описание функции: [Atan2](http://en.wikipedia.org/wiki/Atan2).

`Math.sin(x)`
: Вычисляет синус `x` (в радианах)
: Вычисляет синус `x`

`Math.cos(x)`
: Вычисляет косинус `x` (в радианах)
: Вычисляет косинус `x`

`Math.tan(x)`
: Возвращает тангенс `x` (в радианах)
: Возвращает тангенс `x`

### Функции общего назначения

Expand Down Expand Up @@ -517,7 +517,7 @@ JavaScript предоставляет базовые тригонометрич
: Возвращает наименьший из списка аргументов

`Math.random()`
: Возвращает псевдо-случайное число в интервале [0,1) - то есть между 0(включительно) и 1(не включая). Генератор случайных чисел инициализуется текущим временем.
: Возвращает псевдослучайное число в интервале [0,1) - то есть между 0 (включительно) и 1 (не включая). Генератор случайных чисел инициализуется текущим временем.

### Форматирование

Expand Down