Java 大长度相乘的精度损失

Java 大长度相乘的精度损失,java,double,long-integer,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个值的精度。预期/正确的值是'8426661309621243382112,

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

给定两个初始值作为输入,计算项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个值的精度。预期/正确的值是'8426661309621243382112,但我得到

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
作为我的数据类型来处理相同的问题,会给出正确的答案,但不是我需要的格式(这是用于自动测试用例)

为什么我在使用long时会出现这种精度损失,如何防止它/获得所需的输出

这是因为a(或9.223372e+18)。你不能再高了

如果
double
对于您的应用程序具有足够的精度,您可以根据规范对其进行格式化,例如


如果
double
不够精确,可以使用。但它的性能成本要高得多。

尝试使用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;
        }
    }

}
import java.math.biginger;
公开课考试{
公共静态void main(字符串[]args){
大整数x1,x2,x3;
x1=新的大整数(“0”);
x2=新的大整数(“1”);
对于(int i=3;i)可能的
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;
        }
    }

}