java double类型的最大整数值

public class Main
{
    public static void main(String[] args)
    {
        double d = 50003598627370496L;
        System.out.println(d);
        double a = 45035996273704964L;
        System.out.println(a);
    }
}

//输出:

5.0003598627370496E16
4.503599627370496E16

Process finished with exit code 0

为什么数值小的整数精准度被砍了一位,但是数值大的却完整的保留了所有数据?

不是应该数值超过一定界限才会砍精准度吗?

这个是有效数字的问题,他的有效数字不是根据10进制的位数,而是二进制的位数算的,double的有效数字是53位二进制,超出的部分都会被当成0

        System.out.println(Long.toBinaryString(50003598627370496L));
        System.out.println(Long.toBinaryString(45035996273704964L));
        System.out.println(Long.toBinaryString(50003598627370496L).substring(0, 53));
        System.out.println(Long.toBinaryString(45035996273704964L).substring(0, 53));
        System.out.println(Long.parseLong("10110001101001100000001000001101101011001111011000000000", 2));
        System.out.println(Long.parseLong("10100000000000000000000000000000000000000000000000000000", 2));

转成二进制后取53位再补上0直到和原来的位数相同

10110001101001100000001000001101101011001111011000000000
10100000000000000000000000000000000000000000000000000100
10110001101001100000001000001101101011001111011000000
10100000000000000000000000000000000000000000000000000
50003598627370496
45035996273704960

 

System.out.println(Double.MAX_VALUE); //2的1024次方-1,308个数位,是float数位的10倍,主要用来做复杂运算和天文运算 
System.out.println(Double.MIN_VALUE); //2的-1074次方