Самый удобный для пользователей сервиса вариант: это модель №3.
Как списывать?
В базовом случае, есть 3 переменных:
1. Баланс пользователя
2. Дата активации подписки
3. Стоимость за период времени
Дано (пример):
1. Пользователь пополнил баланс на 180 ед. (прежний - был: 20 ед.) и итоговый баланс стал: 200 ед.
2. Спустя какое-то время - пользователь активировал подписку. Допустим, 15 августа.
3. Пусть за (календарный!) месяц услуга стоит 300 единиц.
Значит его остаток при активной подписке N-дней равен:
20+180-300*12/365*N => из расчёта за обычный год (не високосный!).
Например, баланс через 5 дней (20-го августа):
20+180-300*12/365*5 = 150,68493150684931506849315068493 ед.
Отображаем в ЛК пользователя как обычное математическое округление до 2-й цифры (включительно) после запятой (0-4 - в меньшую сторону, 5-9 - в большую): 150,68 ед.
Чтобы сохранять точность - никогда не вычитайте из баланса пользователя израсходованную сумму: всегда считайте ТОЛЬКО через коэффициенты в формуле!
Все статичные коэффициенты формулы (не участвующие в расчётах суточного баланса) - считаем заранее (для ускорения и снятия нагрузки) и храним с МАКСИМАЛЬНОЙ точностью!