处理双算术的不准确性? [重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

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

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

java double
1个回答
5
投票

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

是。使用BigInteger

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

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

© www.soinside.com 2019 - 2024. All rights reserved.