我写了一个测试数字是否为素数的方法。为了最大化用户可以输入的数字范围,我想使用双打。问题是,在一个非常大的素数上测试它,比如大约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;
}
}
我知道它不能在非常高的数字下工作的原因是因为准确性错误,但这是否存在?
答案 0 :(得分:5)
我知道它在非常高的数字下工作的原因是因为准确性错误,但是有没有呢?
是。使用BigInteger
。
请注意,long
会优于double
,因为long
可以精确地表示最多2 ^ 63 - 1的所有整数。相比之下,使用double
,您开始在2 ^ 53 + 1时失去精度。但是这两种类型都不适合40(十进制)数字。
BigInteger
算术速度明显变慢,但只要你有足够的堆空间,你就可以达到(至少)2 ^ Integer.MAX_VALUE ...