使用Java更改计算器

使用Java更改计算器,java,calculator,calc,Java,Calculator,Calc,我需要创建一个程序,能够以最有效的方式计算变化。例:3个25美分而不是75便士。它只是一美元的钞票、25美分的硬币、10美分的硬币等等。然而,我需要遵守一些规则 1) 将原始输入字符串的美元和美分组件分离为单独的子字符串 2) 使用Integer实用程序类将这两个子字符串解析为原始整数值 3) 你不能在工作中使用任何打字 4) 彻底测试以确保不存在舍入误差 代码是我最初做的,但对于某些值,我总是很便宜 public class ChangeCalculator { public static v

我需要创建一个程序,能够以最有效的方式计算变化。例:3个25美分而不是75便士。它只是一美元的钞票、25美分的硬币、10美分的硬币等等。然而,我需要遵守一些规则

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

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

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

原因是
NumberOfMoney*100
114.99999999
,因此
(int)(NumberOfMoney*100)
114
。一般来说,您应该小心不要相信
double
float
变量的值是准确的。

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

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

原因是
NumberOfMoney*100
114.99999999
,因此
(int)(NumberOfMoney*100)
114
。一般来说,您应该小心不要相信
double
float
变量的值是准确的。

更改
int NumberOfCoins=(int)(NumberOfMoney*100)
to
intnumberofcoins=(int)(数学四舍五入(NumberOfMoney*100))


正如其他同行提到的,在处理货币问题时,double和float不能被真正信任,值得一读

更改您的
int NumberOfCoins=(int)(NumberOfMoney*100)
to
intnumberofcoins=(int)(数学四舍五入(NumberOfMoney*100))


正如其他同行所提到的,在处理货币时,double和float不能被真正信任,值得一读

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

在一些地方,您可以执行以下操作:

int NumberOfCoins = (int)(NumberOfMoney * 100);
这就是强制转换,在
int
double
之间强制转换可能会导致您看到的舍入错误。你可以通过特殊的方式来解决这个问题

然而,我认为你最好遵循你的第一条指示:

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

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

您看到的错误与您没有按照说明3操作以避免类型转换有关

在一些地方,您可以执行以下操作:

int NumberOfCoins = (int)(NumberOfMoney * 100);
这就是强制转换,在
int
double
之间强制转换可能会导致您看到的舍入错误。你可以通过特殊的方式来解决这个问题

然而,我认为你最好遵循你的第一条指示:

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

然后你就可以处理整数了,这样你的计算就更清晰了。

这里的问题是double并不像一些人所认为的那样精确。在代码中,问题取决于

int NumberOfCoins=(int)NumberOfMoney*100

由于此操作的输出为114.99999999。。。 这里有两个选项,您可以使用
Math.round
对操作进行舍入,也可以使用另一种更精确但速度较慢的类型,如
BigDecimal

如果希望达到该精度,您可以使用BigDecimal,但BigDecimal上不存在诸如
+,-,/*
之类的基本运算符,但您可以使用它们的方法
加、乘、减
,等等

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

NumberOfMoney
应该是
NumberOfMoney

NumberOfCoins
应该是
NumberOfCoins
名字可以改进,但目前还可以

如果将一个
int
除以另一个
int
,则最终值将始终为
int
,无需强制转换它。
乙二醇

//以下语句是相等的
int NumberOfCoins=(int)(NumberOfCoins/100);
int NumberOfDollars=NumberOfCoins/100;
此操作过于复杂,您可以将其简化得更多

//来自
int NumberOfDollars=NumberOfCoins/100;
NumberOfCoins=NumberOfCoins-100*NumberOfDollars;
//到
int NumberOfDollars=NumberOfCoins/100;
NumberOfCoins=NumberOfCoins%100;
更新2:
根据您发布的规则,您没有遵守规则1、2和3。 对于规则1,它要求您隔离字符串的两个组件。第一个成分是美元价值,第二个成分是美分价值

String amountValue = "1.15";
String dollaralue = "1" // you need to figure out how to do this.
String centValue = "15" // same
对于规则2,请查看文档中的parseInt,并详细说明parseInt


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

这里的问题是double并不像某些人所认为的那样精确。在代码中,问题取决于

int NumberOfCoins=(int)NumberOfMoney*100

由于此操作的输出为114.99999999。。。 这里有两个选项,您可以使用
Math.round
对操作进行舍入,也可以使用另一种更精确但速度较慢的类型,如
BigDecimal

如果希望达到该精度,您可以使用BigDecimal,但BigDecimal上不存在诸如
+,-,/*
之类的基本运算符,但您可以使用它们的方法
加、乘、减
,等等

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