2

可能重复:
为什么不使用 Double 或 Float 来表示货币?

我正在学习 Java,所以请耐心等待这样一个简单的问题。当给出计算利息时,我输入了以下代码:

 public double calculateTotal(double rate, int n)
 {
     amount = amount * Math.pow((1+rate), (n/12));
     return amount;
 }

这将返回我正在寻找的答案,但会不断在末尾添加 0.000000000001。我将如何解决这个问题?一位朋友建议了一种称为数字格式的方法,但我找不到解决方案。

4

2 回答 2

1

这个问题与众所周知的浮点计算问题有关。

解决方案之一可以使用import java.math.BigDecimal

编辑

Java 不允许覆盖运算符,因此将BigDecimals 加在一起的唯一方法是使用add方法 eg(假设您的数量是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))));
于 2013-01-11T17:34:21.997 回答
1

如前所述,BigDecimal如果您需要更好的双打精度,这是一个不错的选择。

用 s 进行舍入有很好的方法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.00122将是1.22等。这种方法简化并增加了计算,但它并不适用于所有系统。然而,为了这个问题的简单性,我不会深入探讨这个主题。

于 2013-01-12T11:56:01.090 回答