数字格式
可能重复:
为什么不使用Double或Float来表示货币?
我正在学习Java,因此请耐心等待这样一个简单的问题。 当给出一个计算来计算利息时,我输入了这个代码:
public double calculateTotal(double rate, int n)
{
amount = amount * Math.pow((1+rate), (n/12));
return amount;
}
这会返回我正在查找的答案,但会一直添加0.000000000001到最后。 我将如何解决这个问题? 一位朋友建议了一种叫数字格式的东西,但我找不到解决方案。
这个问题与广为人知的浮点计算问题有关。
其中一个解决方案可以使用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))));
正如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
s不用于存储货币信息; long
型具有特定的精度来代替,例如用于精密2,值100
将是1.00
, 122
将是1.22
等等。这方法简化和种子起来计算,但是这是不好的所有系统。 然而,为了简化这个问题,我不会深入探讨这个问题。
上一篇: number formatting