我需要创建一个程序,该程序可以以最有效的方式计算变化。例如3个季度而不是75个便士。它仅是一元钞票,四分之一硬币,一角硬币等。但是,我需要遵循一些规则。
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
答案 0 :(得分:2)
将此作为您在Main
中的第二行:
int NumberOfCoins = (int)Math.round(NumberOfMoney * 100);
这是因为NumberOfMoney * 100
是114.999999999
,所以(int)(NumberOfMoney * 100)
是114
。通常,您应注意不要完全相信double
和float
变量的值。
答案 1 :(得分:2)
这里的问题是,双精度不如某些人可能使您相信的那么精确。在您的代码中,问题取决于
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,它要求您隔离String的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 :(得分:1)
更改您的int NumberOfCoins = (int)(NumberOfMoney * 100);
到int NumberOfCoins = (int)(Math.round(NumberOfMoney * 100));
正如其他同行所提到的,在处理货币时不能真正信任double和float,值得一读Why not use Double or Float to represent currency?
答案 3 :(得分:1)
您看到的错误与您没有遵循第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.
然后,您将处理整数,并且可以更清晰地进行计算。