Вы хотите сохранить свою валюту в 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
.