Вы хотите сохранить свою валюту в longи рассчитать валюту в double, по крайней мере , в качестве резервного. Вы хотите, чтобы все транзакции происходили как long.
Причина, по которой вы хотите хранить свою валюту, longзаключается в том, что вы не хотите терять валюту.
Предположим, вы используете double, и у вас нет денег. Кто-то дает вам три цента, а затем забирает их.
You: 0.1+0.1+0.1-0.1-0.1-0.1 = 2.7755575615628914E-17
Ну, это не так круто. Может быть, кто-то с 10 долларами хочет отдать свое состояние, сначала дав вам три цента, а затем 9,70 доллара кому-то еще.
Them: 10.0-0.1-0.1-0.1-9.7 = 1.7763568394002505E-15
И тогда вы отдаете им десять центов назад
Them: ...+0.1+0.1+0.1 = 0.3000000000000018
Это просто сломано.
Теперь давайте используем long и будем отслеживать десятые доли центов (поэтому 1 = $ 0,001). Давайте дадим каждому на планете один миллиард сто двенадцать миллионов семьдесят пять тысяч сто сорок три доллара:
Us: 7000000000L*1112075143000L = 1 894 569 218 048
Подожди, мы можем дать каждому более миллиарда долларов и потратить чуть больше двух? Переполнение - это катастрофа.
Таким образом, всякий раз , когда вы рассчитываете сумму денег для передачи, использования doubleи Math.roundего получить long. Затем исправьте остатки (сложите и вычтите обе учетные записи), используя long.
Ваша экономика не протечет, и она увеличится до четырех миллиардов долларов.
Есть более сложные вопросы - например, что вы делаете, если делаете двадцать платежей? * - но это должно помочь вам начать.
* Вы рассчитываете, что один платеж, округлить до long; затем умножьте на 20.0и убедитесь, что он в пределах досягаемости; Если это так, вы умножаете платеж 20Lна сумму, вычтенную из вашего баланса. В общем, все транзакции должны обрабатываться как long, так что вам действительно нужно суммировать все отдельные транзакции; Вы можете умножить как ярлык, но вам нужно убедиться, что вы не добавляете ошибки округления и не переполняетесь, что означает, что вам нужно проверить doubleперед выполнением реального вычисления с long.