我正在为课堂做一个贷款计算器。我差不多完成但唯一缺少的是如何围绕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
答案 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
,结果转换为Double
或Float
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类型(float
,Float
,double
,Double
)。浮点数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));}}