有没有 cleaner/simpler 的方法在代码中编写这个公式?
Is there a cleaner/simpler way for writing this formula in code?
我需要 return 双精度值。
这个值是从这个公式推导出来的。
月息=余额*利率/100.00/12.0
由于一些精度问题,我将在计算期间使用 BigDecimal 和 return 双精度值(因为这是货币的表示方式)。
我试过下面的代码,它工作得很好,但如果你问我的话,它看起来很长而且有点不可读。
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;
你知道 balance * interest rate
的结果总是除以 100
和 12
。因此,您可以将公式的这些静态部分保存在 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();
我强烈建议您为 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();
}
这样,代码保持可读性,但要付出一定的代价:代码行数更多!
我需要 return 双精度值。 这个值是从这个公式推导出来的。
月息=余额*利率/100.00/12.0
由于一些精度问题,我将在计算期间使用 BigDecimal 和 return 双精度值(因为这是货币的表示方式)。
我试过下面的代码,它工作得很好,但如果你问我的话,它看起来很长而且有点不可读。
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;
你知道 balance * interest rate
的结果总是除以 100
和 12
。因此,您可以将公式的这些静态部分保存在 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();
我强烈建议您为 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();
}
这样,代码保持可读性,但要付出一定的代价:代码行数更多!