Переменная Java Double отказывается идти отрицательным после вычитания - PullRequest
1 голос
/ 25 марта 2011
double interest_pos = 1.0003, interest_neg = -0.002;
            double balance = CustomersList.getItem(i).get_balance();
            boolean transacted = false;
            for ( int mth = 1; mth <= 31; mth++ )
            {   
                System.out.println(balance);
                for ( int j = 1; j <= numTrans; j++ )
                {           
                    if ( CustomersList.getItem(i).get_accountid() == TransList.getItem(j).get_accountid() )
                    {   
                        String tempdate = TransList.getItem(j).get_date();
                        date = tempdate.split(delimiter);
                        if ( TransList.getItem(j).get_type().equals("credit") && Integer.parseInt(date[0]) == mth && !transacted )
                        {
                            balance += TransList.getItem(j).get_amount();
                            transacted = true;
                            if ( balance >= 0 ) balance *= interest_pos;
                            else balance *= interest_neg;
                        }
                        else if ( TransList.getItem(j).get_type().equals("credit") && Integer.parseInt(date[0]) == mth && transacted )
                        {
                            balance += TransList.getItem(j).get_amount();
                        }
                        else if ( TransList.getItem(j).get_type().equals("debit") && Integer.parseInt(date[0]) == mth && transacted )
                        {
                            System.out.println( "Deducted " + TransList.getItem(j).get_amount());
                            balance -= TransList.getItem(j).get_amount();
                        }
                        else if ( TransList.getItem(j).get_type().equals("debit") && Integer.parseInt(date[0]) == mth && !transacted )
                        {       
                            balance -= TransList.getItem(j).get_amount();
                            transacted = true;
                            if ( balance >= 0 ) balance *= interest_pos;
                            else balance *= interest_neg;
                        }
                        else
                        {
                            if ( balance >= 0 ) balance *= interest_pos;
                            else balance *= interest_neg;
                        }
                    }
                }
                System.out.println ("Day " + mth + " Balance " + balance );
                transacted = false;

Выше часть моего кода.Остальная часть моего кода считывает данные из текстового файла, и все работает хорошо, пока часть, где двойное значение должно быть вычтено на 500,0.

День 22 Баланс 225.86301881168654

День 23Баланс 0.5478672869645392

После 22 дня он должен быть -275,54 ...... но вместо этого он показывает то, что показывает сейчас.Это последний компонент моего задания, и я застрял здесь часами в поисках решений!Заранее благодарю за любую помощь.

РЕДАКТИРОВАТЬ: я добавил больше моего кода, это проблема с тем, как Java работает с математическими операциями в двоичной форме, когда 225.86301881168654 - 500.0 это становится странным результатом, который я получаю?

Ответы [ 4 ]

6 голосов
/ 25 марта 2011

Я не знаю, какая именно проблема здесь, но используйте BigDecimal (вместо double) при работе с деньгами.

2 голосов
/ 25 марта 2011

Я предлагаю вам пройтись по коду с помощью отладчика, и вы увидите, как на самом деле меняются ваши значения.

Ваш отрицательный интерес представляет интереса_neg = -0,002.который вы умножаете на сумму.

Скажем, у вас следующая ситуация

double balance = -100;
if ( balance >= 0 ) balance *= interest_pos;
else balance *= interest_neg; // balance = -100 * -0.002 = +0.2

Отрицательный интерес не имеет никакого смысла в этом значении, как вы можете видеть.Если бы у меня был долг в миллион долларов, в следующем месяце у меня было бы 200 долларов.Чем больше у меня долгов, тем больше денег у меня будет в следующем месяце.

Поэтому, когда у вас отрицательный баланс, вы снова делаете его положительным.Возможно, ваш отрицательный интерес должен быть 1,002, аналогично вашему положительному интересу.

else balance *= interest_neg; // balance = -100 * 1.002 = -100.2
0 голосов
/ 08 декабря 2016

Я был довольно потрепан из-за всей этой переменной «Negative Double», так как сумма суммы была определенно отрицательной. Выполняя операторы IF, что если бы 2-ая переменная была> 1-ой переменной, она перевернула бы переменные и затем умножила бы на -1. Это не сработало, хотя .... Двойные числа на самом деле прекрасно рассчитываются ... У меня был BOOLEAN оператор ниже в коде, который искал только положительные суммы. Это избавило меня от необходимости переписывать десятки переменных. Надеюсь, это кому-нибудь поможет.

0 голосов
/ 25 марта 2011

Трудно сказать, что происходит, когда мы не видим полный код, но эти изменения должны вам помочь:

double balance;
System.out.println(balance);
balance -= TransList.getItem(j).get_amount();
System.out.println(balance);
transacted = true;
if ( balance >= 0 ) balance *= interest_pos;
else balance *= interest_neg;
System.out.println(balance);
...