编写代码错误以获取正确的数学结果

时间:2019-04-13 21:25:08

标签: java math

尽管我的购买功能给出了不正确的数学结果,但我编写了一个“购买”和“出售”比特币的程序。

在我的程序中,我有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 个答案:

答案 0 :(得分:1)

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

您正在此处更改程序的状态。第一次运行后,USD为12000,但是bitcoin为8000。因此,下次执行相同的操作时,将得到意外的值。

在while循环内使用临时变量,以使原始变量不会被覆盖。实际上,最好将bitcoin标记为final变量。

答案 1 :(得分:1)

您没有重置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);

    ...