除以大整数以获得精确值

时间:2014-05-26 09:25:41

标签: java algorithm

我试图找到 1 /(2 ^ n)的值,其中 0< = n< = 200

我曾尝试使用biginteger,但它将输出设为零。我想在分裂后获得确切的数字。

import java.math.BigInteger;


public class Problem2 {
    public static void main(String args[]){
        BigInteger bi1 =  new BigInteger("2").pow(200);
        BigInteger bi2 =    BigInteger.ONE;

         BigInteger bi3 = bi2.divide(bi1);
         System.out.println(bi3);  //why it giving output zero
    }
}

在使用BigDecimal时,它会给出指数值,但是如何在没有指数的情况下获得精确值。

4 个答案:

答案 0 :(得分:3)

因为0< bi3< 1,因此整数结果为0.尝试BigDecimal代替BigInteger

答案 1 :(得分:3)

BigInteger与Integer类似,因为两个整数之间的计算结果是整数。

如果我们写int n = 1 / 1024,结果同样为0。

试试这个:

  BigDecimal b =  new BigDecimal( new BigInteger("2").pow(200) );
  BigDecimal one =  new BigDecimal(1);
  BigDecimal quotient = one.divide(b);
  System.out.println(quotient);   //scientific notation. (140 significant digits) 
  System.out.println(quotient.toPlainString()); //regular notation with leading zeros

答案 2 :(得分:1)

1 /(2 ^ 200)的结果将非常小,绝对不是整数,所以你得到的零结果是“正确的”。

答案是如此之小,即使Java双(64位)也会耗尽精度。你可能会哄BigDecimal给出正确的答案,但性能几乎肯定会很糟糕。

为什么你需要这么精确?估计宇宙中的原子数约为10 ^ 38,我认为它大约是2 ^ 150。如果我们知道你想要做什么,我们可以提供更好的帮助。

答案 3 :(得分:0)

如果得到小数点的结果,请尝试使用float / Double。