自定义货币系统乘法
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);
}
我还在学习中,请放轻松。
我有以下货币系统:
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);
}