这个问题在这里已有答案:
我写了一个测试数字是否为素数的方法。为了最大化用户可以输入的数字范围,我想使用双打。问题是,在一个非常大的素数上测试之后,就像40位左右一样,我的方法返回false(我已经用int版本测试了逻辑,就我所知,它工作得很好)。这是我的代码:
public static boolean isPrime(double number) {
double sqrt = Math.sqrt(number);
for(double i = 2; i<= sqrt; i++) {
if(number%i == 0) {
return false;
}
}
我知道它不能在非常高的数字下工作的原因是因为准确性错误,但是这周围有吗?
我知道它不能在非常高的数字下工作的原因是因为准确性错误,但是这周围有吗?
是。使用BigInteger
。
请注意,long
将优于double
,因为long
可以精确地表示高达2 ^ 63 - 1的所有整数。相比之下,使用double
,你会在2 ^ 53 + 1时开始失去精度。但是这些类型都不适合40(十进制)数字。
BigInteger
算法明显变慢,但是你可以达到(至少)2 ^ Integer.MAX_VALUE ...只要你有足够的堆空间。