为了账号安全,请及时绑定邮箱和手机立即绑定

有没有一种更干净/更简单的方法来在代码中编写这个公式?

有没有一种更干净/更简单的方法来在代码中编写这个公式?

胡子哥哥 2022-09-28 10:06:39
我需要返回一个双精度值。此值派生自此公式。每月利息 = 余额 * 利率 / 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 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

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

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();


查看完整回答
反对 回复 2022-09-28
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

我强烈建议您增加一些精确度。否则,您可能会得到一些声明,即没有提供确切的精度。BigDecimalArithmeticException


执行类似操作


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();

}

这样,代码保持可读性,但这需要一定的价格:有更多的代码行!


查看完整回答
反对 回复 2022-09-28
  • 2 回答
  • 0 关注
  • 75 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信