以下代码计算自动售货机发出的变更。我的问题?我不能让变量变量起作用,因为编译器不会因为两种不同的数据类型(int& double conversion)而让我失望。任何人都可以帮我解决这个问题。 我尝试过铸造“改变”但是它不会打印正确的数量。 例如,如果更改为0.25美分,则更改值保持为零。当然,原因显而易见。问题从第16行开始。我已经将示例中的部分评为change = 0.25。
public String[] itemList = new String[] {"Water ","Coke ", "Diet Coke", "Iced Tea","Fanta "};
public double[] priceList = new double[] {75,120, 120, 100, 150};
public int[] itemQty = new int[]{10,10,10,10,10};
public int[] coinList = new int[]{100,50,20,10,5};
public int[] coinQty = new int[]{10,10,10,10,10};
public double change;
public double paid;
public void ReturnChange()
{
int Denominations=5;
int coins_dispensed = 0 ;
int[] InitialArray = new int[Denominations];
//My Problem begins here..for example if change is computed
change = 0.25; //change is a global declaration of type double and carries values derived from different function
int change1 = (int)change; //if i cast here, i get change as 0, thus the part that follows, fails to compute coins dispensed.
for (int i=0; i < 5; i++)
{
InitialArray[i] += coinQty[i]; // Copies Coin Quantity to Initial array for difference
}
System.out.println("Your change is "+NumberFormat.getCurrencyInstance().format(Math.abs(change1)) +" which comprises of:"); //OK till here
for (int i=0; i<5; i++)
{
if (coinQty[i]>0) //if a particular denomination is available
{
coins_dispensed = (change1/coinList[i]); //dividing coins dispense with denomination
coinQty[i] -= coins_dispensed; //reduce the quantity of the denomination dispensed
change1 = change1 - (coinList[i] * coins_dispensed); //total the change
}
else // Moves to next denomination if a particular coin runs out
{
coins_dispensed = (change1/coinList[i+1]);
coinQty[i+1] -= coins_dispensed ;
change1 = change1 - (coinList[i+1] * coins_dispensed);
}
}
if (change1 != 0) // In the case not enough coins to make change, selection is ignored.
{
System.out.println("\n\n\t Sorry. The machine doesnt have enough coins to make up your change. Your last transaction has been ignored.");
}
else
{
for (int i=0; i<Denominations; i++)
{
coins_dispensed = InitialArray[i] - coinQty[i];
System.out.println( "\n\t\t\t" + coins_dispensed +" of "+ coinList[i] + " cents coins");
}
}
}
答案 0 :(得分:2)
您应该在任何地方使用integers
,但计入美分不美元。打印时只需将数字除以100即可。
这是因为floats
和doubles
无法准确表示用于货币的基数10倍数,并会引入舍入误差,尤其是在乘以计算利率时。例如。
有关更多信息和讨论,请参阅Why not use Double or Float to represent currency?。
答案 1 :(得分:0)
似乎你所有的变量都以美分价格(我猜可乐不是120美元)。但你的变化显然是用美元来说明的。所以你可以做的是将变量乘以100,然后将其转换为 int 。
就像那样:
int change1 = (int) (change * 100); // convert dollars to cents and cast to int
如果你需要在某个时候以美元(而不是美分)输出change1,你必须将其转换回来:
float result = change1 / 100.0f;