是否可以使用更简洁的方式在代码中编写此公式?

时间:2019-04-08 10:27:09

标签: java math double bigdecimal

我需要返回一个双精度值。 此值是从此公式得出的。

每月利息=余额*利率/ 100.00 /12.0

由于一些精度问题,我将在计算过程中使用BigDecimal并返回一个双精度值(因为这就是金钱的表示方式)。

我已经尝试了下面的代码,它可以正常工作,但是如果您问我,它看起来很长而且有点难以理解。

double bal = 10, rate=2, hundred = 100.00, month = 12.0;

double monthInt= (BigDecimal.valueOf(bal).multiply(BigDecimal.valueOf(rate)).divide(BigDecimal.valueOf(hundred)).divide(BigDecimal.valueOf(month))).doubleValue();

return monthInt;

2 个答案:

答案 0 :(得分:3)

您知道balance * interest rate的结果将始终除以10012。因此,您可以将公式的这些静态部分保存在static变量中。

private static final BigDecimal MONTH_IN_PERCENT = BigDecimal.valueOf(100 * 12);

然后在您的计算中使用它:

return BigDecimal.valueOf(bal).multiply(BigDecimal.valueOf(rate).divide(MONTH_IN_PERCENT).doubleValue();

如果可以保证使用bal * rate <= Long.MAX_VALUE,则可以使用以下版本:

return BigDecimal.valueOf((long) bal * rate).divide(MONTH_IN_PERCENT).doubleValue();

答案 1 :(得分:1)

我强烈建议您为您的BigDecimal部门增加一些精度。否则,您可能会得到ArithmeticException的提示,说明没有提供确切的精度。

做这样的事情

public static double calculateMonthlyInterest(BigDecimal balance, BigDecimal rate,
               BigDecimal hundred, BigDecimal month) {
    return balance.multiply(rate)
            .divide(hundred, 2, BigDecimal.ROUND_HALF_UP)
            .divide(month, 2, BigDecimal.ROUND_HALF_UP)
            .doubleValue();
}

或者这(如果您想提供double参数):

public static double calculateMonthlyInterest(double balance, double rate,
               double hundred, double month) {
    BigDecimal b = new BigDecimal(balance);
    BigDecimal r = new BigDecimal(rate);
    BigDecimal h = new BigDecimal(hundred);
    BigDecimal m = new BigDecimal(month);
    return b.multiply(r)
            .divide(h, 2, BigDecimal.ROUND_HALF_UP)
            .divide(m, 2, BigDecimal.ROUND_HALF_UP)
            .doubleValue();
}

这样,代码保持可读性,但是要付出一定的代价:代码行更多!