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

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

В моей программе у меня есть 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");
    }
}

Ответы [ 2 ]

1 голос
/ 14 апреля 2019

Вы не сбрасываете переменную 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 голос
/ 14 апреля 2019
bitcoin = bitcoin * buy;
USD = USD - bitcoin;

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...