Два режима
Первый — пересчёт: вы вводите, сколько у вас каких купюр и монет, а страница считает общую сумму, отдельные подытоги по купюрам и монетам и общее число знаков.
Второй — размен: вы вводите сумму, а калькулятор показывает, какими номиналами её набрать наименьшим числом знаков. Это тот же вопрос, что задаёт кассир, выдавая сдачу.
Оба режима показывают полный разбор арифметики: каждое умножение в первом и каждое деление с остатком во втором.
Почему считается в целых мелких единицах
Вся арифметика ведётся в копейках, а не в рублях с запятой. Причина техническая и важная: дробные числа в компьютере хранятся приближённо, и 0,1 + 0,2 не равно ровно 0,3 ни в одном языке, использующем стандартные вещественные числа.
На одной операции это незаметно, но касса складывает сотни значений, и ошибка накапливается. Поэтому номинал 500 рублей хранится как 50 000 копеек, все сложения идут в целых, и запятая появляется только при выводе на экран.
У индонезийской рупии разменной единицы нет вовсе, поэтому её «мелкая единица» равна самой рупии, и суммы показываются без десятичной части. Калькулятор различает эти случаи, а не подставляет две цифры всем подряд.
Что значит «канонический набор номиналов»
Способ «бери самое крупное, что помещается» кажется очевидным, но в общем случае он не даёт минимума. Классический пример — выдуманный набор из 1, 3 и 4: чтобы набрать 6, жадный алгоритм берёт 4 + 1 + 1, то есть три знака, тогда как 3 + 3 даёт два.
Набор, на котором жадный способ всегда оптимален, называется каноническим. Реальные валюты почти всегда такие: ряд 1–2–5 у рубля, ряд 1–5–10–25 у доллара и риала — все канонические.
В файле валют это свойство записано явным флагом. Смысл в том, чтобы валюту, у которой его нет, можно было обработать другим алгоритмом, а не выдавать худший ответ, делая вид, что он лучший.
Суммы, которые набрать нельзя
Не всякую сумму можно выдать наличными. Если она не кратна самому мелкому доступному номиналу, точного набора не существует — и это не ошибка ввода, а свойство самих денег.
Калькулятор в таком случае не округляет молча. Он показывает ближайшее, что набирается, отдельной строкой выводит ненабираемый остаток и объясняет, какой номинал является наименьшим.
В рублях это встречается редко, потому что копеечные монеты формально существуют. В дирхамах — постоянно: монеты мельче 25 филсов практически вышли из обращения, и суммы на практике округляют до 25 филсов.
Купюры и монеты по отдельности
Каждый номинал помечен как купюра или монета, и подытоги считаются раздельно. Это сделано потому, что кассу сводят именно так: бумага и мелочь считаются и хранятся отдельно.
Практическая польза видна сразу. Смена на 40 000 рублей, в которой 6 000 — монетами, и такая же смена с 500 рублями мелочи — это две совершенно разные ситуации для того, кто открывает кассу утром.
Общее число знаков показывается рядом. Оно отвечает на другой вопрос: сколько всего предметов придётся физически пересчитать, и именно от него зависит, сколько это займёт времени.
Свои номиналы
Кнопка «Добавить свой номинал» принимает любую пару «номинал — количество». Она нужна для старых денег, жетонов, талонов, подарочных сертификатов и для валюты, которой нет в списке.
Свои номиналы участвуют в общей сумме наравне со всеми и помечаются в разбивке отдельно, чтобы было видно, что они внесены вручную.
Для валюты, которой нет в списке, это и есть рабочий способ: выберите любую валюту с нужным числом знаков после запятой и внесите все номиналы вручную.
Изъятые номиналы
Номиналы, вышедшие из обращения, из списка не убираются — они помечаются. Причина простая: люди пересчитывают и старые деньги, и пропавшая из списка купюра создаёт больше проблем, чем помеченная.
В режиме размена изъятые номиналы не используются: набирать сумму из того, что уже не выдают, бессмысленно. В режиме пересчёта они учитываются полностью.
Пометка стоит и в таблице разбивки, поэтому при печати или копировании видно, что в пересчёт вошла старая купюра.
Ограничения
Курсов валют здесь нет. Калькулятор считает наличные в одной валюте; перевод между валютами требует актуального курса, а этот сайт живых котировок не использует.
Списки номиналов составлены без доступа к официальному источнику центробанка. Там, где статус номинала неочевиден, он помечен как изъятый, а не выдан за действующий, — но перед серьёзным использованием сверьтесь с официальным списком.
И наконец, страница считает только то, что вы ввели. Она не знает, сколько денег у вас на самом деле, — это по-прежнему вопрос аккуратного пересчёта руками.