在java中从int转换为double

时间:2014-08-10 12:08:10

标签: java int double

以下代码计算自动售货机发出的变更。我的问题?我不能让变量变量起作用,因为编译器不会因为两种不同的数据类型(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");
        }
    }


}

2 个答案:

答案 0 :(得分:2)

您应该在任何地方使用integers,但计入美分美元。打印时只需将数字除以100即可。

这是因为floatsdoubles无法准确表示用于货币的基数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;