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

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

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

Каждый раз, когда я использую функцию покупки (вход 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 Program\n");
            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 && 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
Devin 14 Апр 2019 в 00:25

2 ответа

Лучший ответ

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

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

bitcoin = bitcoin * buy;

Это установит bitcoin равным 4000 * 2.

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

Вам нужно сбросить значение bitcoin на 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 && 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);

    ...
1
Synergi 13 Апр 2019 в 21:36
bitcoin = bitcoin * buy;
USD = USD - bitcoin;

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

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

1
rdas 13 Апр 2019 в 21:34