这是我的第一个程序。我想创建一个转换货币并向用户提供如何最好地花钱的建议。我需要一些进展[关闭]

Posted

技术标签:

【中文标题】这是我的第一个程序。我想创建一个转换货币并向用户提供如何最好地花钱的建议。我需要一些进展[关闭]【英文标题】:This is my first program. I wanted to create a converts currencies and gives advices to user on how best to spend money. I need some advances [closed] 【发布时间】:2022-01-21 08:12:21 【问题描述】:
package firstproject;
import java.util.Scanner;
public class Currency
    public static void main(String[] args) 

        int rubles = 100;
        double rateUSD = 1.35;
        double rateEUR = 1.20;
        double rateGBP = 1.02;
        double rateJPY = 153.29;

        // Interface
        System.out.println("Welcome to the Currency Converter Program \n");
        System.out.println("Используйте одну из перечисленных валют для конвертации: \n 1 - Rubles \n 2 - US dollars \n 3 - Euros \n 4 - British Pounds \n 5 - Japanese Yen \n");
        System.out.println("Please choose the input currency");
        Scanner in = new Scanner(System.in);
        int choice = in.nextInt();
        String inType;
        switch(choice) 
            case 1 -> inType = "Rubles >> " + rubles;
            case 2 -> inType = "US Dollars >> " + rateUSD;
            case 3 -> inType = "Euros >> " + rateEUR;
            case 4 -> inType = "British Pounds >> " + rateGBP;
            case 5 -> inType = "Japanese Yen >> " + rateJPY;
            default -> 
                System.out.println("Какая печаль, я пока не знаю такой валюты.\nПожалуйста, перезапустите программу и выберите валюту из списка :)");
                return;
            
          System.out.println("Please choose the output currency");
        Scanner scanner = new Scanner(System.in);

        System.out.println("Сколько денег у вас осталось до зарплаты?");
        double moneyBeforeSalary = scanner.nextDouble();

        System.out.println("Сколько дней до зарплаты?");
        int daysBeforeSalary = scanner.nextInt();

        System.out.println("Введите команду. Доступные команды: convert и advice.");
        String command = scanner.next();

        if (command.equals("convert")) 

                System.out.println("В какую валюту хотите конвертировать рубли? Доступные варианты: USD, EUR, JPY, GBP.");

                String currency = scanner.next(); // считываю значения с помощью scanner

                if (currency.equals("RUB")) 
                    System.out.println("Ваши сбережения в рублях: " + moneyBeforeSalary / rubles);

                
                switch (currency) 
                    case "RUS" -> System.out.println("Ваши сбережения в рублях:" + rubles );
                    case "USD" -> System.out.println("Ваши сбережения в долларах: " + moneyBeforeSalary / rateUSD);
                    case "EUR" -> System.out.println("Ваши сбережения в евро: " + moneyBeforeSalary / rateEUR);
                    case "GBP" -> System.out.println("Ваши сбережения в долларах: " + moneyBeforeSalary / rateGBP);
                    case "JPY" -> System.out.println("Ваши сбережения в иенах: " + moneyBeforeSalary / rateJPY);
                    default -> System.out.println("Валюта не поддерживается.");
                

             else if (command.equals("advice")) 
            if (moneyBeforeSalary < 3000) 
                System.out.println("Сегодня лучше поесть дома. Экономьте, и вы дотянете до зарплаты!");
             else if (moneyBeforeSalary < 10000) 
                if (daysBeforeSalary < 10) 
                    System.out.println("Окей, пора в Макдак!");
                 else 
                    System.out.println("Сегодня лучше поесть дома. Экономьте, и вы дотянете до зарплаты!");
                
             else if (moneyBeforeSalary < 30000) 
                if (daysBeforeSalary < 10) 
                    System.out.println("Неплохо! Прикупите долларов и зайдите поужинать в классное место. :)");
                 else 
                    System.out.println("Окей, пора в Макдак!");
                
             else 
                if (daysBeforeSalary < 10) 
                    System.out.println("Отлично! Заказывайте крабов!");
                 else 
                    System.out.println("Неплохо! Прикупите долларов и зайдите поужинать в классное место. :)");
                
            
         else 
            System.out.println("Извините, такой команды пока нет.");
        
    

我不确定 switch(choice),我认为这里是多余的。我缺少正确转换货币的代码。我找到了货币转换器的示例,但出于某种原因,他们将变量称为char 类型。我是初学者,我不明白为什么要为这样的变量分配货币值。我发现了类似的东西:char us_dollar_sym = 36; 但是我不明白这些变量的逻辑是什么。

毕竟,char 可以存储符号,而不是数字……还是不?

【问题讨论】:

永远不要使用浮点数来表示金钱。 或许查看this post。 【参考方案1】:

一些改进代码的建议

将程序分解成更小的部分 使用转换方法 为某些 if/else 分支使用方法 将常量用于公共信息

这样会更容易阅读和维护

使用BigDecimal 而不是double 为您的部门选择一种舍入模式(在我使用“半偶数”的代码中)

这将避免意外的精度损失。

正如 Turing85 在 cmets 中提到的,浮点(即双精度)不适合表示货币。这是因为浮点数可能不完全代表该值(您可能会丢失精度)。查看更多here。

例如

import java.io.PrintStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;


public class Test 

    private final static Scanner IN = new Scanner(System.in);
    private final static PrintStream OUT = System.out;
    
    private static final BigDecimal RUBLES = BigDecimal.valueOf(100);
    private static final BigDecimal RATE_USD = BigDecimal.valueOf(1.35);
    private static final BigDecimal RATE_EUR = BigDecimal.valueOf(1.20);
    private static final BigDecimal RATE_GBP = BigDecimal.valueOf(1.02);
    private static final BigDecimal RATE_JPY = BigDecimal.valueOf(153.29);
    private static final RoundingMode ROUNDING_MODE = RoundingMode.HALF_EVEN;
    
    public static void main(String[] args) 
        // Interface
        OUT.println("Welcome to the Currency Converter Program \n");
        OUT.println("Используйте одну из перечисленных валют для конвертации: \n 1 - Rubles \n 2 - US dollars \n 3 - Euros \n 4 - British Pounds \n 5 - Japanese Yen \n");
        OUT.println("Please choose the input currency");
        choose();
        OUT.println("Сколько денег у вас осталось до зарплаты?");
        BigDecimal moneyBeforeSalary = BigDecimal.valueOf(IN.nextDouble());
        OUT.println("Введите команду. Доступные команды: convert и advice.");
        String command = IN.next();
        if (command.equals("convert")) 
            convert(moneyBeforeSalary);
         else if (command.equals("advice")) 
            OUT.println("Сколько дней до зарплаты?");
            BigDecimal daysBeforeSalary = BigDecimal.valueOf(IN.nextInt());
            advice(moneyBeforeSalary, daysBeforeSalary);
         else 
            OUT.println("Извините, такой команды пока нет.");
        
    

    private static void advice(BigDecimal moneyBeforeSalary, BigDecimal daysBeforeSalary) 
        if (moneyBeforeSalary.compareTo(BigDecimal.valueOf(3000)) < 0) 
            OUT.println("Сегодня лучше поесть дома. Экономьте, и вы дотянете до зарплаты!");
         else if (moneyBeforeSalary.compareTo(BigDecimal.valueOf(10000)) < 0) 
            if (daysBeforeSalary.compareTo(BigDecimal.valueOf(10)) < 0) 
                OUT.println("Окей, пора в Макдак!");
             else 
                OUT.println("Сегодня лучше поесть дома. Экономьте, и вы дотянете до зарплаты!");
            
         else if (moneyBeforeSalary.compareTo(BigDecimal.valueOf(30000)) < 0) 
            if (daysBeforeSalary.compareTo(BigDecimal.valueOf(10)) < 0) 
                OUT.println("Неплохо! Прикупите долларов и зайдите поужинать в классное место. :)");
             else 
                OUT.println("Окей, пора в Макдак!");
            
         else 
            if (daysBeforeSalary.compareTo(BigDecimal.valueOf(10)) < 0) 
                OUT.println("Отлично! Заказывайте крабов!");
             else 
                OUT.println("Неплохо! Прикупите долларов и зайдите поужинать в классное место. :)");
            
        
    

    private static void choose() 
        int choice = IN.nextInt();
        String inType;
        switch (choice) 
            case 1 -> inType = "Rubles >> " + RUBLES;
            case 2 -> inType = "US Dollars >> " + RATE_USD;
            case 3 -> inType = "Euros >> " + RATE_EUR;
            case 4 -> inType = "British Pounds >> " + RATE_GBP;
            case 5 -> inType = "Japanese Yen >> " + RATE_JPY;
            default -> 
                OUT.println("Какая печаль, я пока не знаю такой валюты.\nПожалуйста, перезапустите программу и выберите валюту из списка :)");
                return;
            
        
        OUT.println("In type: " + inType);
    

    private static void convert(BigDecimal moneyBeforeSalary) 
        OUT.println("Please choose the output currency");
        OUT.println("В какую валюту хотите конвертировать рубли? Доступные варианты: USD, EUR, JPY, GBP.");
        String currency = IN.next(); // считываю значения с помощью scanner
        if (currency.equals("RUB")) 
            OUT.println("Ваши сбережения в рублях: " + moneyBeforeSalary.divide(RUBLES, ROUNDING_MODE));
        
        switch (currency) 
            case "RUS" -> OUT.println("Ваши сбережения в рублях:" + RUBLES);
            case "USD" -> OUT.println("Ваши сбережения в долларах: " + moneyBeforeSalary.divide(RATE_USD, ROUNDING_MODE));
            case "EUR" -> OUT.println("Ваши сбережения в евро: " + moneyBeforeSalary.divide(RATE_EUR, ROUNDING_MODE));
            case "GBP" -> OUT.println("Ваши сбережения в долларах: " + moneyBeforeSalary.divide(RATE_GBP, ROUNDING_MODE));
            case "JPY" -> OUT.println("Ваши сбережения в иенах: " + moneyBeforeSalary.divide(RATE_JPY, ROUNDING_MODE));
            default -> OUT.println("Валюта не поддерживается.");
        
    

【讨论】:

以上是关于这是我的第一个程序。我想创建一个转换货币并向用户提供如何最好地花钱的建议。我需要一些进展[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 discord.js 中,使用 quick.db 我想为我的机器人的货币系统创建一个卖出命令

如何定位 UIBarButtonItem 并向其添加图像?

使用 Stripe 在应用内显示本地化价格

Java货币转换器应用程序中的异常处理

将 JavaScript 数字转换为货币格式,但没有“$”或任何货币符号 [重复]

将 String^ 转换为 wstring C++