2

Quiero sacar el 5% de cualquier número y se me ha ocurrido de la siguiente manera:

public class Main4Activity extends AppCompatActivity {

    EditText uno;
    TextView tres, tresinvisible, multiplica, divide, haciendocuenta, haciendocuenta2;
    Button btn1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);

        uno = (EditText) findViewById(R.id.uno);
        tres = (TextView) findViewById(R.id.tres);
        tresinvisible = (TextView) findViewById(R.id.tresinvisible);
        multiplica = (TextView) findViewById(R.id.multiplica);
        divide = (TextView) findViewById(R.id.divide);
        haciendocuenta = (TextView) findViewById(R.id.haciendocuenta);
        haciendocuenta2 = (TextView) findViewById(R.id.haciendocuenta2);
        btn1 = (Button) findViewById(R.id.btn1);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int aux0 = Integer.valueOf(uno.getText().toString());
                int resultado = aux0;
                // envio el número a:
                tres.setText("" + resultado + " " + "es el resultado final");
                tresinvisible.setText("" + resultado);
                // aux2 es el número que escribo en mi editText para sacarle el 5%
                int aux2 = Integer.valueOf(tresinvisible.getText().toString());
                // aux3 es igual a 5
                int aux3 = Integer.valueOf(multiplica.getText().toString());
                // multiplico aux2 * aux3
                int casiresultado1 = aux2 * aux3;
                // envio el resultado a:
                haciendocuenta.setText("" + casiresultado1);
                //
                int aux4 = Integer.valueOf(haciendocuenta.getText().toString());
                // divide es igual a 100
                int aux5 = Integer.valueOf(divide.getText().toString());
                // divido aux4 * aux5
                int resultadofinal11 = aux4 / aux5;
                // envio el resultado a:
                haciendocuenta2.setText("" + resultadofinal11);
                //
                int aux6 = Integer.valueOf(tresinvisible.getText().toString());
                int aux7 = Integer.valueOf(haciendocuenta2.getText().toString());
                // resto aux6 - aux7
                int resultadofinal = aux6 - aux7;
                // envio el resultado final a:
                tres.setText("" + resultadofinal + " " + "es el resultado final");
            }
        });
    }
}

Imagino que no es de la mejor manera, pero me ha funcionado bien, he dejado notas de como he realizado cada acción para que esté mas claro el código, pero claro ahora viene mi problema. Como podéis ver en mi código el número del que saco el 5% lo escribo en mi EditText pero si es un número con decimales la aplicación se cierra. ¿Cómo puedo solucionarlo y poder sacar el 5% también de números con decimales?

Gracias! Y si sabéis como podría hacer un código más limpio/corto también os lo agradecería, es como yo he pensado que podía hacerlo pero no sé si es la mejor manera...

El logcat me marca esto cuando se detiene:

java.lang.NumberFormatException: Invalid int: "570.5"

EDITO1:

public class Main4Activity extends AppCompatActivity {

    EditText uno;
    TextView tres;
    Button btn1;

    static final BigDecimal PORCENTAJE_CINCO = new BigDecimal("0.05");

    public BigDecimal calculaCincoPorCiento(BigDecimal numero) {
        return numero.multiply(PORCENTAJE_CINCO);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);

        uno = (EditText) findViewById(R.id.uno);
        tres = (TextView) findViewById(R.id.tres);

        btn1 = (Button) findViewById(R.id.btn1);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                BigDecimal aux0 = new BigDecimal(uno.getText().toString());
                BigDecimal aux1 = new BigDecimal(String.valueOf(calculaCincoPorCiento(PORCENTAJE_CINCO)));
                aux1 = aux1.divide(aux0);
                tres.setText("" + aux1 + " " + "es el 5%");
            }
        });
    }
}

He intentando sacar así el 5% con decimales, viendo la respuesta de @LuiggiMendoza, pero no me saca el 5%, supongo que lo hago mal. ¿Me podéis ayudar? Gracias!

UserNameYo
  • 2,362
  • 2
  • 16
  • 44

2 Answers2

3

Usa BigDecimal:

static final BigDecimal PORCENTAJE_CINCO = new BigDecimal("0.05");

public BigDecimal calculaCincoPorCiento(BigDecimal numero) {
    return numero.multiply(PORCENTAJE_CINCO);
}

Puedes crear instancias de BigDecimal usando una cadena (String) siempre y cuando esta cumpla con el formato válido de un número, el cual es: <parte entera>[<separador de decimales><parte decimal>], donde:

  • <parte entera>: los dígitos de la parte entera del número
  • <separador de decimales>: punto .
  • <parte decimal>: los dígitos que componen la parte decimal del número

Ojo que también lo podrías lograr con double pero BigDecimal tiene la ventaja de que respeta los decimales y el valor exacto de los mismos, mientras que double se almacena como un conjunto de bits y puede llevar a imprecisiones.


Tras tu edición, veo que tienes esta línea:

//bien
BigDecimal aux0 = new BigDecimal(uno.getText().toString());
//extraño
BigDecimal aux1 = new BigDecimal(String.valueOf(calculaCincoPorCiento(PORCENTAJE_CINCO)));

Veo dos problemas aquí:

  1. Necesitas calcular el 5% de aux0, no de la constante PORCENTAJE_CINCO. Por tanto, el parámetro que deberías enviar es aux0.
  2. El método calculaCincoPorCiento ya devuelve una instancia de BigDecimal. Lo que haces es convertir el resultado (una instancia de BigDecimal) a String mediante String.valueOf() y luego creas nuevamente una instancia de BigDecimal. Se puede notar al dividir la línea en secciones (leer en orden 1, 2 y 3 que es el orden de ejecución):

    BigDecimal aux1 =
        //3. A partir de ese string, se crea un nuevo BigDecimal
        new BigDecimal(
            //2. El resultado (un BigDecimal) se convierte a String
            String.valueOf(
                //1. Llamando al metodo que devuelveBigDecimal
                calculaCincoPorCiento(PORCENTAJE_CINCO)
            )
        );
    

Creería yo que puedes reescribir esta línea a

BigDecimal aux1 = calculaCincoPorCiento(aux0);
  • Perfecto, ahora sí todo perfecto, salvo que si no llamo al método `toString` y lo hago así: `BigDecimal aux0 = new BigDecimal(uno.getText());` **Android Studio** me marca `Cannot resolve constructor "BigDecimal(android.text.Editable"` – UserNameYo May 18 '17 at 14:54
  • @UserNameYo ok, elimino esa parte. –  May 18 '17 at 14:55
  • Solucionado, muchas gracias @LuiggiMendoza tu explicación ha sido perfecta :)! – UserNameYo May 18 '17 at 14:56
1

Bueno me parece que tenias casi correcto el calculo solo falta calcular el 5% de aux0:

static final BigDecimal PORCENTAJE_CINCO = new BigDecimal("0.05");

public BigDecimal calculaCincoPorCiento(BigDecimal numero) {
    return numero.multiply(PORCENTAJE_CINCO);
}

 btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                BigDecimal aux0 = new BigDecimal(uno.getText().toString());
                BigDecimal aux1 = new BigDecimal(String.valueOf(calculaCincoPorCiento(PORCENTAJE_CINCO)));

                //aux1 = aux1.divide(aux0);                     
                aux1 = calculaCincoPorCiento(aux0);  //5% de aux0.

                tres.setText(aux1 + " " + "es el 5% de " + aux0);

            }
        });
    }
Jorgesys
  • 103,630
  • 13
  • 52
  • 124