数字格式

可能重复:
为什么不使用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中查看此票据计算问题
  • 编辑

    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.00122将是1.22等等。这方法简化和种子起来计算,但是这是不好的所有系统。 然而,为了简化这个问题,我不会深入探讨这个问题。

    链接地址: http://www.djcxy.com/p/85811.html

    上一篇: number formatting

    下一篇: Equal decimal numbers in Python