处理双算术的不准确性?

时间:2017-12-21 12:50:24

标签: java double

我写了一个测试数字是否为素数的方法。为了最大化用户可以输入的数字范围,我想使用双打。问题是,在一个非常大的素数上测试它,比如大约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;
        }
    }

我知道它不能在非常高的数字下工作的原因是因为准确性错误,但这是否存在?

1 个答案:

答案 0 :(得分:5)

  

我知道它在非常高的数字下工作的原因是因为准确性错误,但是有没有呢?

是。使用BigInteger

请注意,long会优于double,因为long可以精确地表示最多2 ^ 63 - 1的所有整数。相比之下,使用double,您开始在2 ^ 53 + 1时失去精度。但是这两种类型都不适合40(十进制)数字。

BigInteger算术速度明显变慢,但只要你有足够的堆空间,你就可以达到(至少)2 ^ Integer.MAX_VALUE ...