在Java中,是否可以将BigInteger与Double相乘?

4

我有一个非常大的数字(number1)作为BigInteger存储,并且有一个double(number2)。 我计划将number1number2相乘,并将结果存储为double。

使用multiply()方法没有帮助我实现这一目标。接下来该怎么办?


3
你的问题缺乏一些关键信息。首先,"has not helped me"是什么意思? - Brian Roach
2
"我计划将number1和number2相乘,并将结果存储为double类型。" 为什么?试图破解一些未经证实的数学原理吗? - Andrew Thompson
4个回答

19

为了尽可能地保留任意精度,使用 BigDecimal 进行乘法运算,然后将结果转换为 double,如下所示:

BigDecimal tmp = new BigDecimal(myBigInteger);
tmp = tmp.multiply(new BigDecimal(myDouble));
double res = tmp.doubleValue();

8
最简单的解决方案可能是 big.doubleValue() * myDouble
不幸的是,BigInteger.doubleValue() 的实现显然很慢,因此速度不会特别快。(也许如果 Oracle 应用我的补丁,将来可能会更快。)
或者,您可以直接使用Guava DoubleMath.roundToBigInteger(double, RoundingMode)double 四舍五入为 BigInteger

使用 doubleValue() 方法可以解决问题。Javadoc 表示此方法将 BigInteger 作为 double 返回。但是这是怎么做到的呢?BigInteger 的值非常大,它怎么能适应 double 的范围呢? - jII
1
双精度浮点数可以保存高达2^1024,或约为2 * 10^308的值,如果我没记错的话。但是,它在存储这些值时只有有限的“精度”。 - Louis Wasserman
dasblinkenlight的BigDecimal答案比这个答案好得多,因为它没有精度损失。 - Steve Kuo
1
我完全同意。我不确定为什么那个答案没有被接受,而我的却被接受了。 - Louis Wasserman

1
为什么BigInteger#multiply()没有帮助?实际上只有两个合理的答案:
BigInteger a = /* whatever */;
double b = /* whatever */

// either
double result = a.multiply(new BigInteger(b)).doubleValue();
// or
double result = a.doubleValue() * b;

实际上只有两个合理的答案。 - Stephen C

1
在 BigInteger 上调用 .doubleValue(),并将它们作为 double 值相乘。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接