Problemas con la formulación de código para el resultado matemático correcto

He escrito un programa que "compra" y "vende" bitcoin, aunque mi función de compra está dando resultados matemáticos incorrectos.

En mi programa, tengo $ 20000 (doble USD) y bitcoin (que vale $ 4000.

Todo lo que se supone que debe hacer es deducir cuántos bitcoins está comprando de su USD.

Cada vez que uso la función de compra (entrada 1) para comprar al menos 2 a la vez, funciona una vez y luego calcula incorrectamente. Va de 20000 a 12000 (correctamente) y luego de 12000 a -4000. No puedo entender qué le pasa a mi código. Sé que la respuesta es probablemente simple, pero siento que lo he intentado todo.

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");
    }
}
Respuesta 1

No está restableciendo la bitcoinvariable.

En la primera iteración que ejecuta:

bitcoin = bitcoin * buy;

Esto será bitcoinigual a 4000 * 2.

En la segunda iteración, ejecuta la misma línea. Esto se establecerá bitcoinpara ser igual a (4000 * 2) * 2.

Debe restablecer el valor de bitcoina 4000una vez que haya terminado de usarlo.

Puede restablecer el valor de bitcoin al final de la declaración 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) {

O mejor:

Cree una variable estática final que represente el precio del bitcoin, luego utilícela en los cálculos que necesiten esa constante de precio. Se vería algo así:

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);

    ...
Respuesta: 2

Supongo que no hay absolutamente ninguna manera de hacer algo como: Clase c = Class.forName ("Procesador <Entero, Cadena>"); en Java (donde definí el procesador previamente, por supuesto).

Estoy usando el marco restassured, y dentro de él, tiene la clase JsonPath. JsonPath tiene una firma de método de getList (ruta de cadena, clase T); Intenté hacer algo como esto: List <JsonPath & ...

Tengo una aplicación rcp que tiene barras de expansión y, aunque los colores y fondos predeterminados se ven bien en Windows 7, mis clientes que usan Windows XP tienen una aplicación bastante fea. Yo tengo ...

Mi aplicación Java almacena su información en la base de datos MySql versión 8. La información del usuario y la contraseña se almacenan en esta base de datos. Estoy implementando una prueba de integración para probar el método que ...