【问题标题】:Custom currency system multiplication自定义货币系统乘法
【发布时间】:2020-06-16 19:35:20
【问题描述】:

我还在学习,所以放轻松。

我有以下货币系统:

3 种不同的硬币,我们称它们为 Rhodonite(红色)、Daranen(金色)和 Delis(灰色)。 100 个熟食店等于 1 个 Daranen,100 个 Daranen 等于 1 个 Rhodolite。杜鹃花无限制。

所以我试图将该货币乘以两倍。这是我的功能:

    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 还是很陌生。

【问题讨论】:

  • This article 有一些很棒的调试技巧,可以帮助您在自己的代码中发现这类错误。
  • 请不要编辑标题,而是单击以下答案之一旁边的复选标记以接受帮助您解决问题的答案。

标签: java multiplication modulo


【解决方案1】:

您应该只跟踪您的 Delis 的实际价值,假设在屏幕截图上您有 36053 Delis,那么您只需进行简单的操作,每当您显示您的价值时,您就可以将其格式化为“文本明智”。

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

【讨论】:

  • 是的,这比我的回答还要好。仅在显示货币价值时进行转换。否则,所有计算均采用最小面额。
【解决方案2】:

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

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

例如

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

【讨论】:

  • 对不起,迟到的评论。感谢您的帮助,这为我解决了问题。我想现在完全有道理了,昨天我很累。
  • @arvenyon 而不是这个评论,你应该接受答案。这对 AgentM 有帮助,对任何发现您的问题的人也有帮助。
  • @NomadMaker 感谢您提供的信息。将其标记为答案。
【解决方案3】:

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

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

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

在将“carry”添加到下一个最高面额之前,您实际上已经扔掉了它。您需要以相反的方式执行此操作:

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

【讨论】:

  • 对不起,迟到的评论。感谢您的帮助,这为我解决了问题。我想现在完全有道理了,昨天我很累。
  • @arvenyon 我们都去过那里。我建议您花几分钟时间阅读this article 以获取有关调试代码的提示。当您学习这些技巧并养成习惯时,它们可以帮助您度过那些您不在游戏顶端的时期。
猜你喜欢
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多