一道java计算还款的题,运行结果不一样,如何修改?


import java.util.Date;
import java.util.Scanner;
 
class Loan {
    private double annualInterestRate;
    private int numberOfYears;
    private double loanAmount;
    private Date loanDate;
 
    Loan() {
    }
 
    public Loan(double annualInterestRate, int numberOfYears, double loanAmount, Date loanDate) {
        loanDate = new Date();
        this.annualInterestRate = annualInterestRate;
        this.numberOfYears = numberOfYears;
        this.loanAmount = loanAmount;
        this.loanDate = loanDate;
    }
 
    public Date getLoanDate() {
        return loanDate;
    }
 
    public double getAnnualInterestRate() {
        return annualInterestRate;
    }
 
    public void setAnnualInterestRate(double annualInterestRate) {
        this.annualInterestRate = annualInterestRate;
    }
 
    public int getNumberOfYears() {
        return numberOfYears;
    }
 
    public void setNumberOfYears(int numberOfYears) {
        this.numberOfYears = numberOfYears;
    }
 
    public double getLoanAmount() {
        return loanAmount;
    }
 
    public void setLoanAmount(double loanAmount) {
        this.loanAmount = loanAmount;
    }
 
    public double getMonthlyPayment() {
        return loanAmount * (annualInterestRate / 1200) / (1 - Math.pow(1 / (1 + annualInterestRate / 1200), (numberOfYears * 12)));
    }
 
    public double getTotalPayment() {
        return (loanAmount * (annualInterestRate / 1200) / (1 - Math.pow(1 / (1 + annualInterestRate / 1200), (numberOfYears * 12)))) * numberOfYears * 12;
    }
}
 
public class test {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Loan m = new Loan();
        m.setAnnualInterestRate(input.nextDouble());
        m.setNumberOfYears(input.nextInt());
        m.setLoanAmount(input.nextDouble());
        System.out.println("贷款年利率是" + m.getAnnualInterestRate());
        System.out.println("贷款总额是" + m.getLoanAmount());
        System.out.println("贷款年限是" + m.getNumberOfYears());
        System.out.println("月还款额是" + m.getMonthlyPayment());
        System.out.println("还款总额是" + m.getTotalPayment());
    }
}

img

代码和运行结果如上,红笔标出的是运行结果不一样的地方,只差那几个数,我实在搞不明白。

import java.util.Date;
import java.util.Scanner;

class Loan {
    private double annualInterestRate;
    private int numberOfYears;
    private double loanAmount;
    private Date loanDate;

    Loan() {
    }

    public Loan(double annualInterestRate, int numberOfYears, double loanAmount, Date loanDate) {
        loanDate = new Date();
        this.annualInterestRate = annualInterestRate;
        this.numberOfYears = numberOfYears;
        this.loanAmount = loanAmount;
        this.loanDate = loanDate;
    }

    public Date getLoanDate() {
        return loanDate;
    }

    public double getAnnualInterestRate() {
        return annualInterestRate;
    }

    public void setAnnualInterestRate(double annualInterestRate) {
        this.annualInterestRate = annualInterestRate;
    }

    public int getNumberOfYears() {
        return numberOfYears;
    }

    public void setNumberOfYears(int numberOfYears) {
        this.numberOfYears = numberOfYears;
    }

    public double getLoanAmount() {
        return loanAmount;
    }

    public void setLoanAmount(double loanAmount) {
        this.loanAmount = loanAmount;
    }

    public double getMonthlyPayment() {
        return loanAmount * (annualInterestRate / 1200) / (1 - Math.pow(1 / (1 + annualInterestRate / 1200), (numberOfYears * 12)));
    }

    public double getTotalPayment() {
        return (loanAmount * (annualInterestRate / 1200) / (1 - Math.pow(1 / (1 + annualInterestRate / 1200), (numberOfYears * 12)))) * numberOfYears * 12;
    }
}

public class test {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Loan m = new Loan();
        m.setAnnualInterestRate(input.nextDouble());
        m.setNumberOfYears(input.nextInt());
        m.setLoanAmount(input.nextDouble());
        System.out.println("贷款年利率是" + m.getAnnualInterestRate());
        System.out.println("贷款总额是" + m.getLoanAmount());
        System.out.println("贷款年限是" + m.getNumberOfYears());
        System.out.println("月还款额是" + m.getMonthlyPayment());
        System.out.println("还款总额是" + m.getTotalPayment());
    }
}

发帖第一步,学会格式化代码。不然发出来很多人都没兴趣审题了

应该是题目给的测试结果数据不对,我测试就是最后984这个数

上午看到这个题,想着跟现在的业务也有相关之处,拿来练练手
处理工作间隙解决问题,思路如下:
1.首先想到精度问题,涉及到金额的操作,应该使用BigDecimal,楼主直接使用double是不行的
2.快速写demo,涉及到很多细节,如:BigDecimal四则,除法的四舍五入和小数位
3.demo结果不对,疑惑
4.拿手机计算器直接算,精度会差一点,但不会差太多,算出的结果跟楼主和demo都不一样,疑惑

总结:
总在业务中打转,没有太多时间提高基础能力,一个看起来简单的问题,却不知道原因在哪里,难受
如果楼主有了答案,比如题目错了,请告诉我一声,谢谢!