Итак, потратив пару дней на попытки работы со скриптом алгоритма FreeCodeCamp Exact Change, я столкнулся с довольно неожиданной проблемой.

В JavaScript (0,1 + 0,2 === 0,3) ложно.

После того, как я бегал по кругу, крича и угрожая моему ноутбуку рядом вещей, которые нарушили бы Женевскую конвенцию, я просмотрел Интернет, чтобы узнать, не сталкивался ли кто-нибудь еще с такой же проблемой.

Оказывается, мой гнев был неправильно направлен на мой ноутбук (извините); на самом деле она должна была быть нацелена на молодого человека по имени Готфрид Лебиниц, изобретатель бинарных опционов.

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

В JavaScript 0.1 + 0.2 на самом деле равно 0,3000000000000004.

Смущенный? Да, я тоже, пока я случайно не наткнулся на это видео, оно длится около 30 минут, но если вы сможете его просмотреть, вы больше не будете готовиться свешивать пальцы ног своего компьютера над горящими углями, а быстро погуглите старого доброго Готфрида, чтобы узнать наложил на него проклятие (он умер в 1716 году, к вашему сведению, я думаю, что кто-то другой добрался до него первым). Также вы можете просто узнать кое-что о том, как работает двоичная плавающая точка.

Если вам нужна дополнительная информация о формате с плавающей запятой, я бы порекомендовал веб-сайт http://floating-point-gui.de.

Что касается Exact Change от freeCodeCamp… подвинься Бен Аффлек, Math.round() только что стал моим новым лучшим другом.

Люк

jisforjavascript.com