使用Java更改计算器
我需要创建一个程序,能够以最有效的方式计算变化。例:3个25美分而不是75便士。它只是一美元的钞票、25美分的硬币、10美分的硬币等等。然而,我需要遵守一些规则 1) 将原始输入字符串的美元和美分组件分离为单独的子字符串 2) 使用Integer实用程序类将这两个子字符串解析为原始整数值 3) 你不能在工作中使用任何打字 4) 彻底测试以确保不存在舍入误差 代码是我最初做的,但对于某些值,我总是很便宜使用Java更改计算器,java,calculator,calc,Java,Calculator,Calc,我需要创建一个程序,能够以最有效的方式计算变化。例:3个25美分而不是75便士。它只是一美元的钞票、25美分的硬币、10美分的硬币等等。然而,我需要遵守一些规则 1) 将原始输入字符串的美元和美分组件分离为单独的子字符串 2) 使用Integer实用程序类将这两个子字符串解析为原始整数值 3) 你不能在工作中使用任何打字 4) 彻底测试以确保不存在舍入误差 代码是我最初做的,但对于某些值,我总是很便宜 public class ChangeCalculator { public static v
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)代码>
tointnumberofcoins=(int)(数学四舍五入(NumberOfMoney*100))代码>
正如其他同行提到的,在处理货币问题时,double和float不能被真正信任,值得一读更改您的int NumberOfCoins=(int)(NumberOfMoney*100)代码>
tointnumberofcoins=(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