Проблема с формулировкой кода для правильного математического результата

#java #math

#java #математика

Вопрос:

Я написал программу, которая «покупает» и «продает» биткойны, хотя моя функция покупки выдает неправильные математические результаты.

В моей программе у меня есть 20000 долларов (двойной доллар США) и биткойн (который стоит 4000 долларов.

Все, что он должен сделать, это вычесть, сколько биткойнов вы покупаете из своего доллара США.

Каждый раз, когда я использую функцию buy (ввод 1) для покупки как минимум 2 за раз, она срабатывает один раз, а затем вычисляется неправильно. Он переходит от 20000 к 12000 (правильно), а затем от 12000 до -4000. Я не могу понять, что не так с моим кодом. Я знаю, что ответ, вероятно, прост, но я чувствую, что перепробовал все.

 import java.util.*;

public class P3a {

    public static void main(String[] args) {
        Dates d = new Dates();
        String s = d.getDate();
        System.out.println("Date is"   s);
        W3 mywallet = new W3();
        Scanner myscanner = new Scanner(System.in);
        double buy = 0.0;
        int choice = 0;
        double bitcoin = 4000;
        double USD = 20000;
        while (choice != 5) {
            System.out.println("Welcome! Enter a command. n"
                      "Enter 1) Buy Bitcoin n"
                      "Enter 2) Sell Bitcoin  n"
                      "Enter 3) Print Balance n"
                      "Enter 4) Print History n"
                      "ENTER 5) Exit Programn");
            choice = myscanner.nextInt();
            if (choice == 1) {
                System.out.println("How many? ");
                buy = myscanner.nextDouble();
                mywallet.add(buy);
                bitcoin = bitcoin * buy;
                USD = USD - bitcoin;
                System.out.println("you have bought:"   mywallet.numcoins);
                System.out.println(USD);
            } else if (choice == 2 amp;amp; USD >= bitcoin) {
                System.out.println("How many?");  
                buy = myscanner.nextDouble();
                mywallet.subtract(buy);
                System.out.println("you have sold:"   mywallet.numcoins);
                USD = USD   bitcoin;
                System.out.println(USD);
            } else if (choice == 3) {
                System.out.println("Balance:"   mywallet.numcoins);
            } else if (choice == 4) {
                System.out.println("Print Transaction history");
            } else if (choice == 5) {
                // exit
                break;
            }
        }
        System.out.println("Bye");
    }
}
  

Ответ №1:

Вы не сбрасываете bitcoin переменную.

На первой итерации вы запускаете:

 bitcoin = bitcoin * buy;
  

Это значение bitcoin будет равно 4000 * 2 .

На второй итерации вы запускаете ту же строку. Затем это значение будет bitcoin равно (4000 * 2) * 2 .

Вам нужно сбросить значение bitcoin to 4000 , как только вы закончите его использовать.

Вы можете либо сбросить значение биткойна в конце инструкции if:

 if (choice == 1) {
    System.out.println("How many? ");
    buy = myscanner.nextDouble();
    mywallet.add(buy);
    bitcoin = bitcoin * buy;
    USD = USD - bitcoin;
    System.out.println("you have bought:"   mywallet.numcoins);
    System.out.println(USD);
    bitcoin = 4000; // this line was added
} else if (choice == 2 amp;amp; USD >= bitcoin) {
  

Или даже лучше:

Создайте конечную статическую переменную, представляющую цену биткойна, затем используйте ее в вычислениях, требующих этой постоянной цены. Это будет выглядеть примерно так:

 public class P3a {
    private static final double BITCOIN_VALUE = 4000;

    ...
    // your other code
    ...

    buy = myscanner.nextDouble();
    mywallet.add(buy);
    bitcoin = BITCOIN_VALUE * buy;
    USD = USD - bitcoin;
    System.out.println("you have bought:"   mywallet.numcoins);

    ...
  

Ответ №2:

 bitcoin = bitcoin * buy;
USD = USD - bitcoin;
  

Здесь вы меняете состояние программы. После первого запуска USD равно 12000, но bitcoin становится 8000. Поэтому в следующий раз, когда вы сделаете то же самое, вы получите неожиданное значение.

Используйте временные переменные внутри цикла while, чтобы исходные переменные не перезаписывались. На самом деле, было бы лучше пометить bitcoin как final переменную.