数字格式

时间:2013-01-11 17:30:39

标签: java number-formatting

  

可能重复:
  Why not use Double or Float to represent currency?

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

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

这会返回我正在寻找的答案,但一直在添加0.000000000001。 我怎么解决这个问题?一位朋友建议称为数字格式,但我找不到解决方案。

2 个答案:

答案 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.00122将是1.22等。这种方法简化了计算并使计算结果,但对所有系统都不好。然而,为了简化这个问题,我不会过多地涉及这个问题。