Dziwne - odejmuje liczby, ale je dodaje

0

Witam.
Jestem w trakcie pisania kalkulatora na przyciskach w Javie. Napisałem funkcję, która dodaje, odejmuje. Dodawanie działa dobrze lecz odejmowanie już nie.

public static int roznica(int a, int b)
{
    return a-b;
}

Dlaczego powyższy kod mi dodaje dwie liczby do siebie, zamiast odejmować? Gdy dam + do odejmuje.. dziwne..

Z góry dziękuje za pomoc.

dodanie znacznika <code class="java"> - @furious programming

1

Czy nie próbujesz przypadkiem przekazać liczby ujemnej jako drugiego argumentu?
Na 100% powstrzymuje Cie elementarna matematyka.

Przykład w rubim obrazujący problem:

a = 2
b = -2
print a-b
0

przycisk -


        btn_odejmowanie.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent arg0)
            {
                zmienne.a = Integer.parseInt(wyswietl.getText());
                wyswietl.setText("-");
                zmienne.odejmowanie = true;
                zmienne.dodawanie = false;
                zmienne.mnozenie = false;
                zmienne.dzielenie = false;
            }
         });

przycisk =


        btn_wynik.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent arg0)
            {
                zmienne.ab=0;

                 if (zmienne.dodawanie)
                  {
                    zmienne.b = Integer.parseInt(wyswietl.getText());
                    zmienne.ab = suma(zmienne.a, zmienne.b);
                  }

                 else if (zmienne.odejmowanie)
                  {
                    zmienne.b = Integer.parseInt(wyswietl.getText());
                    zmienne.ab = roznica(zmienne.a, zmienne.b);
                  }

                 else if (zmienne.mnozenie)
                  {
                    zmienne.b = Integer.parseInt(wyswietl.getText());
                    zmienne.ab = iloczyn(zmienne.a, zmienne.b);
                  }
                  else if (zmienne.dzielenie)
                  {
                    zmienne.b = Integer.parseInt(wyswietl.getText());
                    zmienne.ab = iloraz(zmienne.a, zmienne.b);
                  }

                 wyswietl.setText(Integer.toString(zmienne.ab));

                    }
                 });
0

Powyższy kod to dziwactwo, nadaje się tylko na podpałkę. Po trzech godzinach nauki nie napisał byś tak głupiego kodu.
Błąd jest w metodach suma i roznica. Dużo rozsądniej byłoby napisać:

                 if (zmienne.dodawanie)
                  {
                    zmienne.b = Integer.parseInt(wyswietl.getText());
                    zmienne.ab = zmienne.a + zmienne.b;
                  }

oraz obsłużyć błąd parsowania.

0

Już wiem na czym polegał błąd.
Gdy wciskałem przycisk - pojawiał się on w okienku w którym wyświetlany jest wynik. Następnie zapisywałem do zmiennej to co jest w tym oknie. Później była konwersja z string na int i liczba b była ujemna. Dlatego tak się działo :)

0
zmienne.a = Float.parseFloat(wyswietl.getText());
zmienne.ab = Math.sqrt(zmienne.a);

Dlaczego mi to nie działa? Wyrzuca błąd: incompatible types: possible lossy conversion from double to float

`dodanie znacznika ``` - @furious programming

0

Math.sqrt zwraca typ double. Zmień typy zmiennych na double i parsuj tak:

zmienna.a = Double.parseDouble(wyswietl.getText());

Przy okazji, dlaczego pole tekstowe do wprowadzania liczby nazywa się wyswietl? Masz tylko jedno pole tekstowe w programie, i użytkownik wprowadza kolejno: pierwszą liczbę, potem drugą i nie widzi wtedy pierwszej, na końcu widzi wynik ale nie widzi liczb?

0

Procenty

  btn_procent.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent arg0)
            {
                zmienne.b = Integer.parseInt(wyswietl.getText());
                zmienne.ab = zmienne.a * (zmienne.b/100);
                wyswietl.setText(Integer.toString(zmienne.ab));
            }
         });

Co tu mam źle ze zawsze wychodzi 0?

0
zmienne.ab = zmienne.a * (zmienne.b/100.0);

/ to dzielenie całkowite, wynik dzielenia liczb typu int jest również typu int.

0

Mam jeszcze jedno pytanko. Dlaczego jak wyliczę pierwiastek jakiejś liczby a potem kliknę na znak działania (+ - * /) to wyrzuca błąd?


btn_pierwiastek.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent arg0)
            {
                zmienne.a = Integer.parseInt(wyswietl.getText());
                wyswietl.setText(Double.toString(Math.sqrt(zmienne.a)));
              //  zmienne.a = Integer.parseInt(wyswietl.getText());
            }
         });

Błąd:


Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "3.1622776601683795"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at kalkulator.Kalkulator$12.actionPerformed(Kalkulator.java:229)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6525)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6290)
    at java.awt.Container.processEvent(Container.java:2234)
    at java.awt.Component.dispatchEventImpl(Component.java:4881)
    at java.awt.Container.dispatchEventImpl(Container.java:2292)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
    at java.awt.Container.dispatchEventImpl(Container.java:2278)
    at java.awt.Window.dispatchEventImpl(Window.java:2739)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
    at java.awt.EventQueue.access$400(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:697)
    at java.awt.EventQueue$3.run(EventQueue.java:691)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:719)
    at java.awt.EventQueue$4.run(EventQueue.java:717)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0