除以欧元金额

时间:2015-03-23 23:50:30

标签: java if-statement java.util.scanner

我的代码中存在问题,但无法找到答案。 我只能使用if和else,并且不能将其他类用于示例Math。

代码保存一个值并尝试除以欧元硬币。 如果我输入4,31,结果是2x2e + 1x20c + 1x1c,这是正常的,但如果我输入值1,20,结果是1e + 1x10c + 1x5c + 2x2c + 1x1c,但正确的结果是1e + 1x20c。 我不得不在1美分硬币中添加0.001,因为如果我没有得到它的打印件。添加这个也是错误的。

如果有人可以帮助我,我将非常感激。 问候。

代码:

import java.util.Scanner;

public class Coins {

    public static void main(String[] args){
        Scanner in= new Scanner(System.in);

        int e2 = 0, e1 = 0,c50 = 0,  c20=0,c10 = 0,c5 = 0,c2 = 0,c1;
        double v;

        System.out.println("Quantia em euros: ");
        v = in.nextDouble();

        e2 = (int)v/2;
        v=v-e2*2;

        e1=(int)v;
        v=(v-e1)*100;

        c50=(int)v/50;
        v=v-c50*50;

        c20=(int)v/20;
        v=v-c20*20;

        c10=(int)v/10;
        v=v-c10*10;

        c5=(int)v/5;
        v=v-c5*5;

        c2=(int)v/2;
        v=v-c2*2;

        c1=(int)(v+0.001);

        if(e2!=0)System.out.print(e2+"X2Eur ");
        if(e2!=0&&!(e1==0&&c50==0&&c20==0&&c10==0&&c5==0&&c2==0&&c1==0))System.out.print("+ ");
        if(e1!=0)System.out.print(e1+"X1Eur ");   
        if(e1!=0&&!(c50==0&&c20==0&&c10==0&&c5==0&&c2==0&&c1==0))System.out.print("+ ");
        if(c50!=0)System.out.print(c50+"X50c ");  
        if(c50!=0&&!(c20==0&&c10==0&&c5==0&&c2==0&&c1==0))System.out.print("+ ");
        if(c20!=0)System.out.print(c20+"X20c ");  
        if(c20!=0&&!(c10==0&&c5==0&&c2==0&&c1==0))System.out.print("+ ");
        if(c10!=0)System.out.print(c10+"X10c ");  
        if(c10!=0&&!((c5==0&&c2==0&&c1==0)))System.out.print("+ ");
        if(c5!=0)System.out.print(c5+"X5c ");     
        if(c5!=0&&!(c2==0&&c1==0))System.out.print("+ ");
        if(c2!=0)System.out.print(c2+"X2c ");    
        if(c2!=0&&!(c1==0))System.out.print("+ ");
        if(c1!=0)System.out.print(c1+"X1c");
    }
}

3 个答案:

答案 0 :(得分:0)

这些是Java的舍入错误,它们总是在使用浮点数时发生。在你的情况下,你继续编辑相同的值,以便错误变得越来越大。

使用

System.out.println("Quantia em euros: ");
v = 1.20;
int cents = (int)(v*100);
e2 = cents/200;
cents = cents%200;

e1=cents / 100;
cents = cents % 100;

c50=cents/50;
cents = cents%50;

c20=(int)cents/20;
cents =  cents %20;

c10=(int)cents/10;
cents = cents%10;

c5=(int)cents/5;
cents = cents % 5;

c2=(int)cents/2;


c1=cents%2;

因为整数错误不会在整数中出现。

答案 1 :(得分:0)

首先:如果你将一个值存储在一个双变量中,总是认为double有点不精确,我会使用它来代替(只需删除逗号并解析为int)。

实现本身:使用数组优化整个事物。

final int[] coin_values = new int[]{
     200 , 100 , 50 , 20 , 10 , 5 , 2 , 1};
final String[] coin_names = new String[]{
     "2€" , "1€" , "50ct" , "20ct" , "10ct" , "5ct" , "2ct" , "1ct"};

String input = in.next();
String[] temp = input.split(".");
input = temp[0] + temp[1];
int value = Integer.parseInt(input);

int[] coins = new int[coin_values.length];

for(int i = 0 ; i < coins.length ; i++){
     coins[i] = value / coin_values[i];
     value %= coin_values[i];

     if(coins[i] != 0)
          System.out.print(coins[i] + " " + coin_names[i] + " + ");
}

答案 2 :(得分:0)

在Java中,始终使用java.math.BigDecimal作为货币金额。 你不会得到你无法控制的奇怪的舍入行为。