java - 处理双重算术的不准确性?

标签 java double

<分区>

我编写了一个方法来测试一个数是否为素数。为了最大化用户可以输入的数字范围,我想使用 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;
        }
    }

我知道它不能在非常高的数字下工作的原因是因为精度错误,但是否存在这个问题?

最佳答案

I know the reason it's not working at very high numbers is because of the accuracy error, but is there around this?

是的。使用 BigInteger

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

BigInteger 运算速度明显较慢,但您将能够(至少)达到 2^Integer.MAX_VALUE ... 只要您有足够的堆空间。

关于java - 处理双重算术的不准确性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47925402/

相关文章:

java - 使用Esapi验证时出错

java - 堆栈溢出错误: How would I write this method Iteratively?

java - 当您仅指定使用List接口(interface)时,java是否使用ArrayList或LinkedList?

java - 添加对旧变更日志文件的更改。液体碱

java - 删除双变量点后的数字(Java)

javascript - Web Firestore - 将 Double 值保存到 Firebase

tomcat - 在Tomcat中加载双数

java - findfragmentbyid 在 vi​​ewpager 下托管 3 个 fragment 的 mainActivity 中返回 null

double - Swift 3 迁移 - 双扩展舍入问题

java - 如何在跳过文本的同时读取 .txt 中的整数和 double ?