苦荞米 2021-06-01 11:03 采纳率: 100%
浏览 130
已采纳

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

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

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

  • 写回答

2条回答 默认 最新

  • 封印di恶魔 2021-06-01 14:46
    关注

    这个是有效数字的问题,他的有效数字不是根据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
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?