如何在大十进制(Java)中存储无穷大?

我正在返回BigDecimal值的方法中编写算法,但时不时地计算出的结果将是+或-无穷大。
而不是程序崩溃,我想捕获异常并将无穷大作为值返回,就像该方法返回双精度值时一样。

例如Double.POSITIVE_INFINITY;

那么,如何在大十进制中存储无穷大呢?还是有另一种方法可以做到这一点?

public static BigDecimal myalgorithm(){

//code to store infinity in a BigDecimal
//return the BigDecimal holding infinity 

}

答案 1

BigDecimal没有无穷大的概念。我可以想到三个选项:

  1. 最干净的方法可能是派生你自己的类,添加一个无穷大标志,告诉你实例是否包含无穷大,并重写与它相关的方法(我认为这将是其中的大部分),当你不持有无穷大时,使用基类的版本,当你持有无穷大时,使用你自己的代码。MyBigDecimal

  2. 您可以在代码中用作标志值,尽管这可能有点痛苦。例如:null

    if (theBigDecimal == null) {
        // It's infinity, deal with that
    }
    else {
        // It's finite, deal with that
    }
    
  3. 如果您已经在使用其他内容,则可以拥有一个实际上不包含无穷大的实例,但您假装它包含它,并用于检查它。例如:nullBigDecimal==

    // In your class somewhere:
    static final BigDecimal INFINITE_BIG_DECIMAL = new BigDecimal(); // Value doesn't matter
    
    // Then:
    if (theBigDecimal == INFINITE_BIG_DECIMAL) {
        // It's infinity, deal with that
    }
    else {
        // It's finite, deal with that
    }
    

答案 2

解决这个问题的一种方法是,在这种情况下只使用一个非常大的数字:

BigDecimal.valueOf(negative ? Double.MIN_VALUE : Double.MAX_VALUE)

由于 BigDecimal 没有实际的最大值或最小值,因此可以使用 double 的值。

这种方法的要点是,它并没有真正解决表示无穷大的问题,但根据用例,它可以很好地解决问题。我将其用于与您上面提到的相同的用例。

实际上,在调用 intValue 时,double 或多或少是相同的。在这种情况下,它将仅表示最大整数。