我需要创建一个程序,可以以最有效的方式计算变化。例如。3个季度而不是75便士。它只有一美元钞票,25美分,一角硬币等。然而,我需要遵循一些规则。
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.999999999,
因此 (int)(NumberOfMoney * 100) 是
114
。通常,您应该注意不要信任
双精度
变量和浮点
变量的值是精确的。
这里的问题是,替身并不像某些人让你相信的那样精确。在您的代码中,问题取决于
int NumberOfCoins=(int)NumberOfMoney*100代码>
由于此操作的输出为 114.999999999...这里有 2 个选项,您可以使用 Math.round
对操作进行舍入,也可以使用其他更精确但更慢的类型,如 BigDecimal
。
如果你想要这个精度,你可以使用BigDecimal 但是像,-,/*
这样的基本运算符在BigDecimal 上不存在,但你可以使用他们的方法加、乘、减
等。
更新 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,它要求你分离字符串的两个组成部分。第一个组件是美元值,第二个是美分值。
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);
。
更改您的int NumberOfCoins=(int)(NumberOfMoney*100)
toint NumberOfCoins=(int)(数学舍入(NumberOfMoney*100))代码>
正如其他同行所提到的,在处理货币时,双倍和浮点不能真正信任,值得一读为什么不使用双倍或浮点来表示货币?