我正在学习Java,所以请耐心等待我这么简单的问题。当给出计算以计算利息时,我输入了这个代码:
public double calculateTotal(double rate, int n)
{
amount = amount * Math.pow((1+rate), (n/12));
return amount;
}
这会返回我正在寻找的答案,但一直在添加0.000000000001。 我怎么解决这个问题?一位朋友建议称为数字格式,但我找不到解决方案。
答案 0 :(得分:1)
此问题与众所周知的浮点计算问题有关。
其中一个解决方案可能是使用import java.math.BigDecimal
修改强>
Java不允许覆盖运算符,因此将BigDecimal
加在一起的唯一方法是使用add
方法,例如(假设您的金额为BigDecimal
。请记住,BigDecimal是不可变的,因此从calculateTotal
返回的任何内容都需要分配回ammount
// you assign result to amount outside calculateTotal
amount.add(new BigDecimal(Math.pow((1+rate), (n/12))));
或
// you assign sum to amount inside calculateTotal
amount = amount.add(new BigDecimal(Math.pow((1+rate), (n/12))));
答案 1 :(得分:1)
如前所述,BigDecimal
是一个很好的选择,如果你需要更好的双精度。
使用BigDecimal
进行四舍五入有很好的方法。基本上,您必须指定BigDecimal
实例的比例。看看这个示例代码:
BigDecimal decimalOne = new BigDecimal(0.1950);
BigDecimal decimalTwo = decimalOne.setScale(2, BigDecimal.ROUND_HALF_DOWN);
BigDecimal decimalThree = decimalOne.setScale(4, BigDecimal.ROUND_HALF_DOWN);
System.out.println("decimalOne: " + decimalOne);
System.out.println("decimalTwo: " + decimalTwo);
System.out.println("decimalThree: " + decimalThree);
Java 7将打印出类似这样的内容:
decimalOne: 0.195000000000000006661338147750939242541790008544921875
decimalTwo: 0.20
decimalThree: 0.1950
请注意,BigDecimal
个实例是不可变的,这就是为什么必须将setScale
的结果分配给新实例(decimalOne
不会更改)。
在许多金融系统中,double
不用于存储货币信息;使用具有特定精度的long
类型,例如对于精度2,值100
将是1.00
,122
将是1.22
等。这种方法简化了计算并使计算结果,但对所有系统都不好。然而,为了简化这个问题,我不会过多地涉及这个问题。