有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java My Basic货币转换器程序输出错误

因此,代码应该转换货币,但它没有正确地进行转换。我有一个变量k(克罗地亚库纳…1欧元=7.5库纳),它是1,例如,如果我想将1欧元转换成1美元,程序将金额(1)乘以7.5,那么我有库纳的欧元金额,这是可行的。但是,当我将结果(7.5)除以6.3(1美元等于6.3库纳)时,我得到了相同的数字

import java.util.Scanner;

public class Conv {
    private double rez;
    private double rez2;
    private double svota;
    Scanner ul = new Scanner(System.in);

    public void PretvorbaInKunu(double y) {
        System.out.print("Insert amomunt: ");
        svota = ul.nextDouble();
        rez2 = svota*y;

    }

    public void PR2(double x) {
        rez = getRez2() / x;
    }

    public double getRez() {
        return rez;
    }
    public double getRez2() {
        return rez2;
    }
    public double getSvota() {
        return svota;
    }

}
import java.util.Scanner;

//Currency Converter

public class Vjezbica {
    public static void main(String[] args) {
        double e = 7.5;
        double d = 6.3;
        double p = 9.5;
        double k = 1.0;
        Conv more = new Conv();
        Scanner in = new Scanner(System.in);

        System.out.print("\t\tCurrency converter\nIz (e,p,d,k) - ");
        String iz = in.next();
        switch(iz) {
        case "e":
            more.PretvorbaInKunu(e);
            break;
        case "d":
            more.PretvorbaInKunu(d);
            break;
        case "p":
            more.PretvorbaInKunu(p);
            break;
        case "k":
            more.PretvorbaInKunu(k);
            break;
        }
        System.out.println(more.getRez2());

        System.out.print(" To  ");
        String u = in.next();
        switch(u) {
        case "e":
            more.PR2(e);
        case "d":
            more.PR2(d);
        case "p":
            more.PR2(p);
        case "k":
            more.PR2(k);
        }
        System.out.println(more.getSvota() + " " + iz + " is " + more.getRez() + " " + u);
    }
}

共 (2) 个答案

  1. # 1 楼答案

    首先,正如托拜厄斯已经指出的那样,错误在于缺少了“突破” 但代码中还有其他错误,例如扫描仪未关闭

    我还建议提高代码质量。您可以编写一个只执行计算的枚举类型(无输入-输入应该分开)。然后,您可以使用不同的枚举构造函数轻松定义货币

    上面还讨论了是否应该使用双精度或双精度十进制。BigDecimal是一种“昂贵”的类型。我想知道浮动是否还不够,因为货币值通常包含2位数的精度——如果你没有处理非常高的金额,32位浮动类型应该已经受到影响

    我将其改写如下:

    import java.util.Scanner;
    
    //Currency Converter
    
    public class Vjezbica {
    
        private static enum Currency {
            EURO(7.5), KUNA(1), DOLLAR(6.3), P(9.3);
    
            private double cr;
    
            Currency(double conversionRate) {
                this.cr = conversionRate;
            }
    
            // precision: 2digits
            public float fromKuna(double kuna) {
                return (int) (((kuna) / cr) * 100) / 100f;
            }
    
            public float toKuna(double foreignCurrency) {
                return (int) (((foreignCurrency) * cr) * 100) / 100f;
            }
        }
    
        private static Currency readCurrency() {
            Scanner in = new Scanner(System.in);
            System.out.print("\t\tCurrency converter\nIz (e,p,d,k) - ");
            String iz = in.next();
            in.close();
    
            switch (iz) { // no break required when returning directly
            case "e":
                return Currency.EURO;
            case "d":
                return Currency.DOLLAR;
            case "p":
                return Currency.P;
            case "k":
                return Currency.KUNA;
            default:
                throw new IllegalArgumentException("invalid input: " + iz);
            }
        }
    
        private static float readAmount() {
            Scanner ul = new Scanner(System.in);
            float svota = ul.nextFloat();
            ul.close();
            return svota;
        }
    
        public static void main(String[] args) {
    
            System.out.print(" From  ");
            Currency c1 = readCurrency();
    
            System.out.print("Insert amomunt: ");
            float svota = readAmount();
    
            float amountInKuna = c1.toKuna(svota);
    
            System.out.print(" To  ");
            Currency c2 = readCurrency();
    
            float amountInC2 = c2.fromKuna(amountInKuna);
            System.out.println(svota + " " + c1.toString() + " is " + amountInC2 + " " + c2.toString());
    
        }
    
    
    }
    

    未考虑:转换首先从X转换为Kuna,然后从Kuna转换为Y。在这两种转换中,我们都在执行不精确舍入(地板而不是正确舍入,地板两次而不是一次)

    根据这个建议,如果你计算出一个精确的转换率,最终可以直接从X转换到Y,然后对最终结果进行一轮运算,那就更好了

  2. # 2 楼答案

    问题在于你的第二个switch case语句:你需要在每个case的末尾加上一个break

    如果像这样更改Vjezbica类,它应该可以工作:

    import java.util.Scanner;
    
    //Currency Converter
    
    public class Vjezbica {
    
        public static void main(String[] args) {
            double e = 7.5;
            double d = 6.3;
            double p = 9.5;
            double k = 1.0;
            Conv more = new Conv();
            Scanner in = new Scanner(System.in);
    
            System.out.print("\t\tCurrency converter\nIz (e,p,d,k) - ");
            String iz = in.next();
            switch (iz) {
                case "e":
                    more.PretvorbaInKunu(e);
                    break;
                case "d":
                    more.PretvorbaInKunu(d);
                    break;
                case "p":
                    more.PretvorbaInKunu(p);
                    break;
                case "k":
                    more.PretvorbaInKunu(k);
                    break;
            }
            System.out.println(more.getRez2());
    
            System.out.print(" To  ");
            String u = in.next();
            switch (u) {
                case "e":
                    more.PR2(e);
                    break;//added break here
                case "d":
                    more.PR2(d);
                    break;//added break here
                case "p":
                    more.PR2(p);
                    break;//added break here
                case "k":
                    more.PR2(k);
                    break;//added break here
            }
            System.out.println(more.getSvota() + " " + iz + " is " + more.getRez() + " " + u);
    
            //you should also close the scanner at the end...
            in.close();
        }
    }