今天使用double计算fibonacci数列的时候,发现到了后面都是以0结尾了,明显有问题,后来发现是两个double相加时有精度丢失,写了一个简单的程序验证了下
import java.text.DecimalFormat;
public class t {
public static void main(String[] args) {
double aaa = 160500643816367072D;
double bbb = 259695496911122560D;
DecimalFormat df = new DecimalFormat("0");
String num = df.format(aaa+bbb);
System.out.println(num);
}
}
输出为420196140727489660,最后两位精度丢失。有效位数为16位。输出DOUBLE.MAX_VALUE时,也只有前十七位不为0。
后来查了一下,java的浮点数使用IEEE 754标准,该标准规定
类型
|
存储位数
|
|