2016-12-27 21 views
1

В конце выполнения этого кода я ожидаю 0.00, но получаю -0.00. Этот код рассчитывает цену облигации на основе рыночной ставки, определяет , если это предлагается с премией или со скидкой, затем рассчитывается.Отрицательное число вместо положительного

Часть, которой я занимаюсь, определяет остаток в счете . При расчете этого я использую - = для переменной premium_bal2.

Вот код:

package totalbeginner.demo; 

import java.text.NumberFormat; 
import java.util.Locale; 

import javax.swing.*; 

public class TotalBeginner{ 

public static void main(String[] args){ 

    System.out.println("We are offering a $100,000 bond at 10% par for 3 years"); 
    double price; //price of bond determined from rates 

    double market_rate = Double.parseDouble(JOptionPane.showInputDialog("What is the market rate?")); 

    NumberFormat formatter= NumberFormat.getCurrencyInstance(Locale.UK); 
    int year=1;//year 


    double premium_bal=0;;//premium balance 
    double premium_bal2=0; 


    if(market_rate<10){//premium bond offer 
     price = (0.10*100000*5.5673)+(100000*0.5565); 
     premium_bal= price-100000;//premium bal 
     premium_bal2 = price-100000;//premium bal 

     System.out.println("Cash dr. "+formatter.format(price)); 
     System.out.println("Premium dr. "+formatter.format(price-100000)); 
     System.out.println("Bonds Payable cr. "+ formatter.format(100000));// issue journal entry 



     while(year<3){ 
     System.out.println("Interest dr. "+formatter.format(10000));//interest payment 
     System.out.println("Cash cr. "+formatter.format(10000)); 

     //write-off 

     System.out.println("Interest dr. "+formatter.format(premium_bal/3)); 
     System.out.println("Premium cr. "+formatter.format(premium_bal/3)); 
     premium_bal2-=premium_bal/3; 


     if (year==2){ 
      System.out.println("Interest dr. "+formatter.format(10000));//interest payment 
      System.out.println("Cash cr. "+formatter.format(10000)); 

      System.out.println("Cash cr. "+formatter.format(100000));//Bond retirement 
      System.out.println("Bonds Payable dr. "+formatter.format(100000)); 

      //write-off 

      System.out.println("Interest dr. "+formatter.format(premium_bal/3)); 
      System.out.println("Premium dr. "+formatter.format(premium_bal/3)); 


      //Amount in balance account 
      premium_bal2-=premium_bal/3; 
      System.out.println("Amount in premium account: "+formatter.format(premium_bal2)); 

       } 
     //counter year 
     year++; 

     } 
    } 
    System.exit(0); 
    }   
} 
+0

Вы не должны использовать типы с плавающей запятой для представления денег. – Bubletan

+0

Чтобы быть уверенным, '' premium_bal2' всегда больше, чем 'premium_bal/3'? fyi, double '0.00' и' -0.00' на самом деле * математически * говорение одинаковое, но различное в двоичном представлении, это ограничение компьютера (в общем). Некоторые люди пытались удалить этот отрицательный знак с некоторыми [трюками] (http://stackoverflow.com/a/11929320/4648586) в любом случае, вместо того, чтобы вмешиваться в сам номер .. - [что вам нужно знать о плавающей запятой ] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

ответ

1

Использование BigDecimal (или int или long, с коэффициентом масштабирования) вместо Double или double, последние для чисел с плавающей точкой и являются лишь приближенными.