如何在Java中使用double来设置BigInteger?

时间:2017-08-09 09:25:46

标签: java math biginteger

标题说明了一切:如何在Java中将BigInteger除以浮点数?我不需要除法的小数部分,可以将其舍入或截断(但我会感兴趣的是哪一个适用)。

“显而易见”甚至无法编译:

BigInteger x = BigInteger.valueOf(73).pow(42);
BigInteger y = x.divide(Math.PI); // The method divide(BigInteger) in the type BigInteger is
                                  // not applicable for the arguments (double)
System.out.println(y);

我希望这个可以工作:

BigInteger y = new BigDecimal(x).divide(BigDecimal.valueOf(Math.PI)).toBigInteger();

不幸的是,它提供了ArithmeticException非终止十进制扩展;没有确切的可表示的十进制结果。π当然是......

当然,这个有用,但速度太慢了......

BigInteger y = BigInteger.valueOf(-1);
BigDecimal σ = BigDecimal.ZERO;
while(σ.compareTo(new BigDecimal(x)) < 0) {
    y = y.add(BigInteger.ONE);
    σ = σ.add(BigDecimal.valueOf(Math.PI));
}

什么是正确的,规范的方式?

1 个答案:

答案 0 :(得分:3)

你必须添加RoundingMode来划分功能,否则java不知道如何围绕除法并给你ArithmeticException

BigInteger y = new BigDecimal(y).divide(BigDecimal.valueOf(Math.PI), RoundingMode.HALF_UP).toBigInteger();

上述文档链接中详细说明了所有舍入类型。