Числа, математика и случайность
Разберёмся, как JavaScript на самом деле считает, обойдём классические ошибки с числами и напишем весёлую игру-угадайку.
- объяснить, почему в JavaScript только один тип чисел,
- понять, почему
0.1 + 0.2не равно ровно0.3, - безопасно округлять числа и работать с деньгами без ошибок,
- распознавать
NaNи правильно его проверять, - пользоваться объектом
Mathи генерировать случайные числа в диапазоне, - собрать всё это в игре-угадайке чисел.
Один тип чисел для всего
Во многих языках есть два отдельных вида чисел: целые (whole numbers, например 7) и с плавающей точкой (десятичные, например 3.14). JavaScript, на котором работает Node, снаружи всё упрощает: тип чисел всего один - он называется number. Напишете вы 7 или 3.14 - Node хранит и то, и другое как один и тот же вид значения: 64-битное число с плавающей точкой.
Аналогия. Представьте линейку, которой можно измерить любую длину, но её самые маленькие деления - это крошечные фиксированные шаги. Целые сантиметры попадают точно на деление, поэтому они идеально точны. А длина вроде "одна треть сантиметра" оказывается между двумя делениями, и линейке приходится выбирать ближайшее - близко, но не идеально. Числа в JavaScript ведут себя так же: целые числа до очень больших значений точны, но многие дроби хранятся лишь как ближайшее доступное значение.
Проверить тип любого значения можно оператором typeof:
typeof 7 // "number"
typeof 3.14 // "number"
typeof -0.5 // "number"
Все три - один и тот же тип. Нет отдельных "int" или "float" - только number. Это упрощает код для новичков, но именно отсюда растут сюрпризы, о которых пойдёт речь дальше.