
Многие покупатели замечают, что итоговые суммы в чеках магазинов часто кажутся завышенными или странными. Долгое время это списывали на инфляцию, наценки или ошибки кассиров. Однако недавно был раскрыт неожиданный секрет: во всём виноват язык программирования, на котором работают кассовые системы, — JavaScript.
JavaScript — один из самых популярных языков для веб-разработки и создания интерфейсов. Однако у него есть известная особенность: проблемы с точностью вычислений с плавающей точкой. Из-за архитектуры чисел с плавающей запятой (стандарт IEEE 754) JavaScript может выдавать неожиданные результаты при сложении, умножении или округлении дробных чисел. Например, 0.1 + 0.2 в JavaScript даёт не 0.3, а 0.30000000000000004. В контексте кассовых операций, где каждая копейка на счету, такая погрешность может накапливаться и приводить к заметным расхождениям в итоговой сумме.
Представьте, что касса складывает стоимость нескольких товаров: 99.99 + 49.99 + 19.99. В идеале должно получиться 169.97, но из-за особенностей JavaScript результат может быть 169.96999999999997. Если система округляет вверх до целого рубля, покупатель платит лишнюю копейку. При тысячах транзакций в день это превращается в значительные суммы для магазина, но незаметно для каждого отдельного клиента.
Конечно, разработчики знают об этой проблеме и используют специальные библиотеки для точных вычислений (например, decimal.js или BigNumber), но не все магазины обновляют своё программное обеспечение вовремя. В некоторых устаревших системах JavaScript продолжает работать с ошибками, что и приводит к «страшным суммам» на чеке.
Таким образом, если вы заметили, что итоговая цена в магазине отличается от ожидаемой, возможно, дело не в злом умысле, а в выбранном языке программирования. И хотя JavaScript отлично подходит для интерактивных сайтов, для финансовых расчётов он требует особой осторожности. А пока мы можем лишь улыбнуться: «Во всём виноват JavaScript 😁».




