自定义货币系统乘法

Custom currency system multiplication

我还在学习中,请放轻松。

我有以下货币系统:

3 种不同的硬币,我们称它们为 Rhodonite(红色)、Daranen(金色)和 Delis(灰色)。 100 Delis 等于 1 Daranen,100 Daranen 等于 1 Rhodonite。 Rhodonites 没有限制。

所以我试图将该货币乘以双倍系数。这是我的函数:

    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);
    }

所以当我乘法时,如果相乘的熟食大于 100,它应该被添加到 daranen,daranen 和 rhodonites 的计数相同。

这是一个乘以因子 2 的示例: 上一个是乘法前,下一个是乘法。

如您所见,乘法本身有效,但不能将余数加到下一个更高的硬币类型。我很高兴得到任何帮助,对 java 来说还是个新手。

您应该只记录您的熟食店的实际价值,假设在屏幕截图上您有 36053 家熟食店,那么您只需进行简单的操作,无论何时显示您的价值,您都可以对其进行格式化 "text wise" .

注意:如果你的值可以高于 2147483647,你应该使用 long 而不是 int

如果我要解决这个问题,我会将整个价格转换为最小的硬币,然后将其加倍,将其转换为所有 3 个硬币的价值。

话虽如此,您的代码的问题在于操作顺序:

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

在将 "carry" 添加到下一个最高面额之前,您实际上已经扔掉了它。你需要反过来做:

da += de / 100; // carry first
de = de % 100;  // then reduce

我建议只保留熟食店并将其转换为其他答案所建议的其他货币。但是,要回答你的问题,关于你做错了什么:

您只需翻转进行模运算和除法运算的行即可。

例如

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);
}