Javascript не умеет считать.
Javascript плохо работает с математикой, и это нормально.
Если честно, особо и не обвинишь, основная проблема присуща всем компьютерным системам.
Подумайте об этом так: Сколько битов требуется компьютерной программе для представления числа? Это зависит (Javascript использует 64), но суть проблемы заключается в следующем: конечные или бесконечные биты? Итак, сколько цифр может иметь число? Ответ — не ограничен.
Поэтому в какой-то момент компьютер столкнется с проблемой представления бесконечного количества чисел в конечном пространстве.
Проблема не в том, что трудно наткнуться:
var x = 0,1;
var y = 0,2;
var z = x + y;
console.log(z)
0.30000000000000004
Что такое з? Если вы скажете 0,3, Javascript захочет с вами поговорить. Попробуй здесь
Десятичные дроби представляют собой дроби. Обычно мы используем основание 10. Например, 0,5 — это представление 1/2. 0,5 — конечное представление 1/2. Мы знаем, что это совершенно верно, после «5» больше не ожидается появления чисел. Однако посмотрите на десятичное представление 1/3 — мы представляем его как десятичное число с основанием 10, равное 0,3333, и в конце концов просто прекращаем писать. Мы знаем, что оставляем это как незавершенную работу, но общество соглашается, что мы можем просто бросить ее в какой-то момент.
Число, о котором идет речь, может быть очень большим или очень маленьким числом — важным вопросом является количество задействованных цифр. В какой-то момент даже самый лучший компьютер вскидывает свои цифровые руки в воздух, вежливо кашляет и закругляется, полагая, что вы вряд ли заметите. И правда в том, что для большинства приложений, кроме самой математики, вы вряд ли это заметите. (Даже НАСА использует только 16 цифр Пи при расчете межпланетных путешествий. С помощью 39–40 цифр вы можете рассчитать диаметр видимой Вселенной до диаметра атома водорода.)
«Сжатие бесконечного множества действительных чисел в конечное число битов требует приблизительного представления… При любом фиксированном числе битов большинство вычислений с действительными числами будут давать величины, которые невозможно точно представить, используя такое количество битов. Поэтому результат вычисления с плавающей запятой часто должен быть округлен, чтобы вернуться к его конечному представлению. Эта ошибка округления является характерной чертой вычислений с плавающей запятой».¹
Ошибки округления в симуляциях и математических задачах.
Непредвиденные ответы в компьютерных программах.
Способы, которыми ошибки с плавающей запятой могут повлиять на поведение компьютерной системы:
- Компьютерная архитектура обычно имеет инструкции с плавающей запятой.
- Компиляторы должны генерировать эти инструкции с плавающей запятой.
- Операционные системы должны решить, что делать, когда для этих инструкций возникают исключения.
Итак, TLDR: компьютеры — это осязаемые, конечные коробки, которые теоретически должны хранить и обрабатывать числа, которые могут быть бесконечно длинными. К
Источники:
1) Что должен знать каждый ученый-компьютерщик об арифметике с плавающей запятой Дэвида Голдберга, опубликовано в мартовском выпуске журнала Computing Surveys за 1991 год. Copyright 1991, Association for Computing Machinery, Inc.»
2) https://www.w3schools.com/js/tryit.asp?filename=tryjs_numbers_infinity