学校项目,双倍到最近的分。

时间:2014-09-26 20:36:07

标签: java

我正在为课堂做一个贷款计算器。我差不多完成但唯一缺少的是如何围绕INTEREST_RATE而不是$ 298.95833333333337我希望获得$ 298.96。但我不知道如何。

输入旧的原则= 25000
输入您当前的付款= 450

之前的余额:25000.0美元 付款方式:450.0美元 已付利息:151.04166666666666
原则支付:298.95833333333337
新校长:$ 24701.041666666668

import java.util.Scanner; 

public class LoanCalculator {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    /**
     * Declaration Section  
     * 
     */
    Scanner keyboard = new Scanner(System.in); 
    double INTEREST_RATE; 
    double currentPayment;
    double oldPrincipal;
    double interestPaid;
    double principalPaid;
    double newPrincipal; 


    /**
     * Process Section
     * 
     */

    System.out.println("Enter your old Principle = ");
    oldPrincipal = keyboard.nextDouble(); 

    System.out.println("Enter your current payment = ");
    currentPayment = keyboard.nextDouble();  

    INTEREST_RATE = 7.25 / 100.0; //fix this 

    interestPaid = oldPrincipal * INTEREST_RATE / 12;

    principalPaid = currentPayment - interestPaid; 

    newPrincipal = oldPrincipal - principalPaid; 


    /**
     * Output Section
     * 
     * */
    System.out.println("Previous Balance: " + "$"+ oldPrincipal);
    System.out.println("Payment: " + "$"+ currentPayment);
    System.out.println("Interest Paid: " + "$"+ interestPaid);
    System.out.println("Principle Paid: " + "$"+ principalPaid);
    System.out.println("New Principal: " + "$"+ newPrincipal); 


}//Main()

}//LoanCalculator

4 个答案:

答案 0 :(得分:3)

从不使用进行财务计算!它是really dangerous

来自Java语言规范:

  

float :浮点数据类型是单精度32位IEEE 754浮点。其值范围超出了本讨论的范围,但在Java语言规范的浮点类型,格式和值部分中指定。与byte和short的建议一样,如果需要在大型浮点数数组中保存内存,请使用float(而不是double)。 此数据类型绝不能用于精确值,例如货币。为此,您需要使用java.math.BigDecimal类。 Numbers和Strings涵盖了Java平台提供的BigDecimal和其他有用的类。

     

double :双数据类型是双精度64位IEEE 754浮点。其值范围超出了本讨论的范围,但在Java语言规范的浮点类型,格式和值部分中指定。对于十进制值,此数据类型通常是默认选择。 如上所述,此数据类型绝不应用于精确值,例如货币。

使用BigDecimal,它还具有您正在寻找的舍入功能。

答案 1 :(得分:0)

使用此方法是完美和安全的

仅将值转换为String,结果转换为DoubleFloat

public String PerfectRound(String number, int limit){
//        System.out.println(numero);
        String t="";int c=0,e=number.length();
        do {            
            try {
                if(String.valueOf(number.charAt(c)).equals(".")){if(limit==0){break;}e=c+limit+1;}
                t=t+number.charAt(c);
            } catch (Exception je) {
                t=t+"0";
            }
            c++;
//            System.out.println(t);
        } while (c<e);
//        System.out.println(t);
        return t;
    }

示例:

double a=23.32313232;
a=Double.valueOf(PerfectRound(a+"", 2));
System.out.println(a);

答案 2 :(得分:0)

BigDecimal

对于诸如金钱之类的重要事项,绝对不要使用floating-point类型(floatFloatdoubleDouble)。浮点数trades away accuracy用于执行速度。而是使用缓慢但准确的类BigDecimal

选择您的mode of rounding。我选择了“Banker’s rounding”

已在堆栈溢出中多次覆盖。因此,搜索更多信息。简要地,这里是一些入门的代码。我没有运行此代码。

BigDecimal interestPecentage = 
    new BigDecimal( "7.25" )
    .setScale( 2 , RoundingMode.HALF_EVEN )    // Round using Banker’s rounding.
;   

BigDecimal interestRateAnnual = 
    interestPecentage.divide(                 // Divide percentage by 100 to get an interest rate as a decimal fraction.
        new BigDecimal( "100" ) 
    )
    .setScale( 2 , RoundingMode.HALF_EVEN )
; 

答案 3 :(得分:-2)

编辑:
你可以按照上面的要求使用NumberFormat课程,你的问题就解决了, 但另一方面,您应该使用BigDecimal类进行财务计算。 BigDecimal类内置了格式化程序,所以我添加它。

      public class LoanCalculator {public static void main(String[] args) {
   Scanner keyboard = new Scanner(System.in);
    BigDecimal INTEREST_RATE, currentPayment, oldPrincipal, interestPaid, principalPaid, newPrincipal, month;
    System.out.println("Enter your old Principle = ");
    oldPrincipal = keyboard.nextBigDecimal();
    System.out.println("Enter your current payment = ");
    currentPayment = keyboard.nextBigDecimal();
    NumberFormat formatter = new DecimalFormat("#0.00");
    INTEREST_RATE = new BigDecimal(7.25 / 100.0);
    formatter.format(INTEREST_RATE);//only format
    month = new BigDecimal(12);
    interestPaid = INTEREST_RATE.multiply(oldPrincipal);
    interestPaid = interestPaid.divide(month, 2);
    principalPaid = currentPayment.subtract(interestPaid);
    newPrincipal = oldPrincipal.subtract(principalPaid);
    System.out.println("Previous Balance: " + "$" + oldPrincipal);
    System.out.println("Payment: " + "$" + currentPayment);
    System.out.println("Interest Paid: " + "$" + interestPaid.setScale(2, RoundingMode.HALF_UP)
            + " $" + formatter.format(interestPaid));
    System.out.println("Principle Paid: " + "$" + principalPaid.setScale(2, RoundingMode.HALF_UP)
            + " $" + formatter.format(principalPaid));
    System.out.println("New Principal: " + "$" + newPrincipal.setScale(2, RoundingMode.HALF_UP)
            + " $" + formatter.format(newPrincipal));}}