2016-12-27 66 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(或intlong,具有缩放因子),而不是Doubledouble,后者是浮点数和只是近似值。