java - 乘以大长整型会导致精度损失

标签 java double long-integer

我正在研究一个本质上是斐波那契数列的问题陈述:

给定两个初始值作为输入,您可以计算项 x = (项 x-1)^2 + (项 x-2)

因此,给定输入 0 1 5,我们要计算序列的第 5 项,按以下方式完成:

第 3 项 =(第 2 项)^2+(第 1 项)= 1^2 + 0 = 1

第 4 项 =(第 3 项)^3+(第 2 项)= 1^1 + 1 = 2

第 5 项 = 2^2+1 = 5

等等。

当我尝试计算一个大值(例如第 10 个值)时,我的问题就出现了。使用long作为我的数据类型,我在第10个值处精确地丢失了精度。预期/正确的值为`84266613096281243382112,但我得到..

0 1 10
Term number 3 has value 1
Term number 4 has value 2
Term number 5 has value 5
Term number 6 has value 27
Term number 7 has value 734
Term number 8 has value 538783
Term number 9 has value 290287121823
Term number 10 has value 1886167576011600224

使用double作为我的数据类型执行相同的问题,反而给了我正确的答案,但不是我需要的格式(这是用于自动化测试用例)。

0 1 10
Term number 3 has value 1.0
Term number 4 has value 2.0
Term number 5 has value 5.0
Term number 6 has value 27.0
Term number 7 has value 734.0
Term number 8 has value 538783.0
Term number 9 has value 2.90287121823E11
Term number 10 has value 8.426661309628124E22

为什么我会长期遇到这种精度损失,如何防止它/获得我想要的输出?

最佳答案

尝试使用 BigInteger 类,它可以工作:

import java.math.BigInteger;

public class Test {

    public static void main(String[] args) {
        BigInteger x1, x2, x3;

        x1 = new BigInteger("0");
        x2 = new BigInteger("1");

        for (int i = 3; i <= 10; i++){
            x3 = x2.multiply(x2).add(x1);
            System.out.println(i + ":" + x3);
            x1 = x2;
            x2 = x3;
        }
    }

}

关于java - 乘以大长整型会导致精度损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26189169/

相关文章:

java - GETUploader 在启动时添加文件

c - 从 Byte Array 读取并转换为 Double

java - 将字符串解析为 double 得到错误 java.lang.NumberFormatException : empty String

Java Collections.shuffle() 奇怪的行为

C++ - 荒谬的长距离

java - 从类扩展构造函数

java - Java 中的平台相关编码问题

c - 如何从 char 缓冲区创建 long int?

Java Spring 配置文件在 Linux 中不起作用

java - 类型不匹配 : can't convert from double to int java