BigDecimal部门正在逐步推进

时间:2015-12-04 16:09:13

标签: java bigdecimal

我正在尝试计算以下内容:

(1 - (1/365)) * (1 - (2/365) = 0.99727528617

我想存储整个小数。这是我的代码,但它给了我一个答案:

public BigDecimal probability(int t){
    BigDecimal probT; // holds our probability of a single (1-(t/365))
    BigDecimal result; // holds our result
    result = BigDecimal.ONE; // initialize result to 1

    // for 1 to t-1
    for (int n = 1; n < t; n++){            
        int numerator = n; // numerator the value of n

        int denominator = 365; // denominator 365 

        // numberator / denominator (round down)
        probT = BigDecimal.valueOf(numerator).divide(BigDecimal.valueOf(denominator), RoundingMode.DOWN);

        // 1-answer
        probT = BigDecimal.ONE.subtract(probT);

        // multiply the probabilities together 
        result = result.multiply(probT);

    }
    return result;
}

BigDecimal ans2 = bc.probability(3);
System.out.println("P(3) = " + ans2.toString());  

输出:

P(3) = 1

2 个答案:

答案 0 :(得分:5)

那是因为你正在计算的分工用0表示。引用方法divide(divisor, roundingMode) Javadoc:

  

返回BigDecimal,其值为(this / divisor),其比例为this.scale()

在这种情况下,this.scale()指的是分子的比例,它是0,因为分子是BigDecimal.valueOf(n)n是整数。

您需要更改此分部以使用divide(divisor, scale, roundingMode),并指定所需的比例。

答案 1 :(得分:1)

来自java doc

  

提供MathContext对象时,精度设置为0   (例如,MathContext.UNLIMITED),算术运算是精确的,   不带MathContext对象的算术方法也是如此。 (这个   是5之前版本中唯一支持的行为。)

     

作为计算确切结果的推论,舍入模式   设置精度设置为0的MathContext对象不是   使用,因而无关紧要。在除法的情况下,确切的商   可以有一个无限长的十进制扩展;例如,1   除以3。

     

如果商具有非终止的十进制扩展和   指定操作以返回精确结果,a   抛出ArithmeticException。否则,确切的结果   如同其他操作一样,返回除法。

要修复,您需要执行以下操作:

   // numberator / denominator (round down)
        probT = BigDecimal.valueOf(numerator).divide(BigDecimal.valueOf(denominator), 10,RoundingMode.DOWN);

其中10是精度(小数位精度),RoundingMode.DOWN是舍入模式

相关问题