Умножение пользовательской валютной системы - PullRequest
1 голос
/ 16 июня 2020

Я все еще учусь, поэтому go легко для меня.

У меня следующая валютная система:

3 разных монеты, назовем их Родонит (красный цвет), Даранен (золотой цвет ) и Делис (серый цвет). 100 делисов равны 1 даранену, 100 дараненам равны 1 родониту. Нет ограничений с родонитами.

Итак, я пытаюсь умножить эту валюту на двойной коэффициент. Вот моя функция:

    public static Price multiply(Price price, double factor) {
       int de = (int)Math.round(price.getDelis() * factor);
       int da = (int)Math.round(price.getDaranen() * factor);
       int r = (int)Math.round(price.getRhodoniten() * factor);
       if ((de / 100) >= 1) {
           de = de % 100;
           da += de / 100;
       }
       if ((da / 100) >= 1) {
           da = da % 100;
           r += da / 100;
       }
       return new Price(r, da, de);
    }

Итак, когда я умножаю, если умноженный delis больше 100, он должен быть добавлен к daranen, то же самое количество для daranen и родонитов.

Вот пример, умноженный на коэффициент 2: верхний перед умножением, нижний умножается.

Example

Как видите, умножение само работает, но не добавление остатка к следующему более высокому типу монеты. Я рад любой помощи, все еще новичок в java.

Ответы [ 3 ]

7 голосов
/ 16 июня 2020
• 1000 *

Примечание: если вы можете иметь значения выше 2147483647, вы должны go для long вместо int

1 голос
/ 16 июня 2020

Я предлагаю оставить только Delis и конвертировать их в другие валюты, как предлагали другие ответы. Однако, чтобы ответить на ваш вопрос, что вы сделали не так:

Вам просто нужно перевернуть строки, где вы выполняете операцию по модулю и где вы делаете деление.

например,

de = de % 100;
da += de / 100;

должно быть

da += de / 100;
de = de % 100;

Вот правильный код:

public static Price multiply(Price price, double factor) {
    int de = (int) Math.round(price.getDelis() * factor);
    int da = (int) Math.round(price.getDaranen() * factor);
    int r = (int) Math.round(price.getRhodoniten() * factor);
    if ((de / 100) >= 1) {
        da += de / 100;
        de = de % 100;
    }
    if ((da / 100) >= 1) {
        r += da / 100;
        da = da % 100;
    }
    return new Price(r, da, de);
}
0 голосов
/ 16 июня 2020

Если бы я решал эту проблему, я бы преобразовал всю цену в самую маленькую монету, а затем удвоил бы ее, преобразовав ее в стоимость всех трех монет.

С учетом сказанного, проблема с code - это порядок операций:

de = de % 100;
da += de / 100;

Вы фактически выбрасываете «перенос», прежде чем добавить его к следующему по величине номиналу. Вам нужно сделать это наоборот:

da += de / 100; // carry first
de = de % 100;  // then reduce
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...