我需要创建一个程序,以最有效的方式计算变化。防爆。 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
试试这个作为你在Main
的第二行:
int NumberOfCoins = (int)Math.round(NumberOfMoney * 100);
这是因为NumberOfMoney * 100
是114.999999999
,所以(int)(NumberOfMoney * 100)
是114
。一般来说,你应该小心不要相信double
和float
变量的值是准确的。
这里的问题是双重并不像某些人可能引导你相信的那么精确。在您的代码中,问题依赖于
int NumberOfCoins = (int)NumberOfMoney * 100;
因为这个操作的输出是114.999999999 ...这里有2个选项,你可以使用Math.round
or使用另一种更精确但像BigDecimal
一样慢的操作。
如果你想要那个精度你可以使用BigDecimal,但是像Qazxswpoi这样的基本运算符在BigDecimal上不存在,但是你可以使用它们的方法+,-,/*
等。
更新1: 代码审查 理想情况下,变量的命名应以小写开头,然后是以下所有单词,即开头的大写字母。例如。
add, multiply, substract
应该是NumberOfMoney
numberOfMoney
应该是NumberOfCoins
这些名字可以改进,但目前还可以。
如果你将numberOfCoins
除以另一个int
,那么最终值将始终是int
,没有必要施放它。
例如
int
此操作过于复杂,您可以简单地进行操作
//The following statements are equal
int NumberOfDollars = (int)(NumberOfCoins/100);
int NumberOfDollars = NumberOfCoins / 100;
更新2: 根据您发布的规则,您不遵循规则1,2和3.对于规则1,它要求您隔离String的2个组件。第一个组件是美元值,第二个组件是美分值。
//from
int NumberOfDollars = NumberOfCoins / 100;
NumberOfCoins = NumberOfCoins - 100 * NumberOfDollars;
//to
int NumberOfDollars = NumberOfCoins / 100;
NumberOfCoins = NumberOfCoins % 100;
对于规则2,请查看String amountValue = "1.15";
String dollaralue = "1" // you need to figure out how to do this.
String centValue = "15" // same
的文档,特别是parseInt的文档。
对于规则3,这是类型化Integer。
将你的int NumberOfCoins = (int)(NumberOfMoney * 100);
改为int NumberOfCoins = (int)(NumberOfMoney * 100);
正如其他同行提到的那样,在处理货币时不能真正信任双倍和浮动,值得阅读int NumberOfCoins = (int)(Math.round(NumberOfMoney * 100));
您看到的错误与您未遵循指令3的事实有关,以避免类型转换。
在几个地方你做的事情如下:
Why not use Double or Float to represent currency?
这是铸造,并且在int NumberOfCoins = (int)(NumberOfMoney * 100);
和int
之间施放可能会导致您看到的舍入错误。您可以通过特定方式舍入来解决此问题。
但是,我认为你应该遵循你的第一条指令:
double
然后你将处理整数,并可以更干净地进行计算。