【问题标题】:Change Calculator Using Java使用 Java 更改计算器
【发布时间】:2019-08-31 02:43:35
【问题描述】:

我需要创建一个能够以最有效的方式计算变化的程序。前任。 3 季度而不是 75 便士。它只是单张钞票、25 美分硬币、1 美分硬币等。但是,我需要遵守一些规则。

1) 将原始输入字符串的美元和美分部分分离为单独的子字符串。

2) 使用 Integer 实用程序类将这两个子字符串解析为原始整数值。

3) 您不得在工作中使用任何类型转换。

4) 彻底测试以确保不存在舍入误差。

代码是我最初所做的,但对于某些值我总是一分钱

public class ChangeCalculator
{
public static void Main (String args[]){
    double NumberOfMoney = Double.parseDouble(args [0]);
    int NumberOfCoins = (int)(NumberOfMoney * 100);

    System.out.println("Amount of Money: " + NumberOfMoney + "\n");

    int NumberOfDollars = (int)(NumberOfCoins/100);
    NumberOfCoins = NumberOfCoins - 100 * NumberOfDollars;
    System.out.println("Dollars: " + NumberOfDollars);

    int NumberOfQuarters = (int)(NumberOfCoins/25);
    NumberOfCoins = NumberOfCoins - 25 * NumberOfQuarters;
    System.out.println("Quarters: " + NumberOfQuarters);

    int NumberOfDimes = (int)(NumberOfCoins/10);
    NumberOfCoins = NumberOfCoins - 10 * NumberOfDimes;
    System.out.println("Dimes: " + NumberOfDimes);

    int NumberOfNickels = (int)(NumberOfCoins/5);
    NumberOfCoins = NumberOfCoins - 5 * NumberOfNickels;
    System.out.println("Nickels: " + NumberOfNickels);

    int NumberOfPennies = (int)(NumberOfCoins/1);
    NumberOfCoins = NumberOfCoins - 1 * NumberOfPennies;
    System.out.println("Pennies: " + NumberOfPennies);
}
}

输入 $1.15 应该输出 美元:1 宿舍:0 硬币:1 镍:1 便士:0 但它输出 美元:1 宿舍:0 硬币:1 镍:0 便士:4

【问题讨论】:

  • "$1.15 应该输出美元:1 硬币:0 硬币:1 硬币:5 便士:0" 不应该是:“美元:1 硬币:0 硬币:1 硬币:1 硬币:0? "
  • 对于您的输入,请先尝试打印 NumberOfCoins 变量并进行调试。 NumberOfCoins 的初始值计算不正确。
  • @AleksW 谢谢我编辑了它

标签: java calculator calc


【解决方案1】:

这里的问题是 double 并不像某些人可能让您相信的那样精确。在您的代码中,问题取决于

int NumberOfCoins = (int)NumberOfMoney * 100;

因为这个操作的输出是 114.999999999... 这里有 2 个选项,您可以使用 Math.round 对运算进行舍入,也可以使用其他更精确但速度较慢的类型,例如 BigDecimal

如果您想要该精度,您可以使用 BigDecimal,但 BigDecimal 上不存在 +,-,/* 等基本运算符,但您可以使用他们的方法 add, multiply, substract 等。

更新 1:
代码审查
理想情况下,变量的命名应以小写字母开头,然后是以下所有单词,以大写字母开头。 例如。

NumberOfMoney 应该是 numberOfMoney
NumberOfCoins 应该是 numberOfCoins 名称可以改进,但目前还可以。

如果您将int 除以另一个int,则最终值将始终为int,则无需强制转换。
例如

//The following statements are equal
int NumberOfDollars = (int)(NumberOfCoins/100);
int NumberOfDollars = NumberOfCoins / 100;

这个操作太复杂了,可以再简单点

//from
int NumberOfDollars = NumberOfCoins / 100;
NumberOfCoins = NumberOfCoins - 100 * NumberOfDollars;

//to
int NumberOfDollars = NumberOfCoins / 100;
NumberOfCoins = NumberOfCoins % 100;

更新 2:
根据您发布的规则,您没有遵循规则 1,2 和 3。 对于规则 1,它要求您隔离字符串的 2 个组件。第一个组件是美元值,第二个是美分值。

String amountValue = "1.15";
String dollaralue = "1" // you need to figure out how to do this.
String centValue = "15" // same

对于规则 2,请查看 Integer 的文档,特别是 parseInt。

对于规则 3,这是类型转换 int NumberOfCoins = (int)(NumberOfMoney * 100);

【讨论】:

    【解决方案2】:

    您看到的错误与您没有遵循说明 3 以避免类型转换有关。

    在几个地方你会做这样的事情:

    int NumberOfCoins = (int)(NumberOfMoney * 100);
    

    这是转换,intdouble 之间的转换可能会导致您看到的舍入错误。您可以通过以特定方式四舍五入来解决此问题。

    但是,我认为您最好遵循您的第一条指令:

    1) Isolate both the dollars and cents components of the original input string into separate sub strings.
    

    然后您将处理整数并且可以更清晰地进行计算。

    【讨论】:

      【解决方案3】:

      更改您的int NumberOfCoins = (int)(NumberOfMoney * 100);int NumberOfCoins = (int)(Math.round(NumberOfMoney * 100));

      正如其他同行提到的那样,在处理货币时 double 和 float 不能真正被信任,值得一读Why not use Double or Float to represent currency?

      【讨论】:

        【解决方案4】:

        尝试将此作为Main 中的第二行:

        int NumberOfCoins = (int)Math.round(NumberOfMoney * 100);
        

        这是因为NumberOfMoney * 100114.999999999,所以(int)(NumberOfMoney * 100)114。一般来说,您应该注意不要相信doublefloat 变量的值是准确的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-23
          • 2018-04-11
          • 1970-01-01
          相关资源
          最近更新 更多