weixin_44927769
苦荞米
2021-06-01 11:03
采纳率: 66.7%
浏览 30

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条回答 默认 最新

  • qq_36911145
    封印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
    点赞 2 评论
  • qq_15769939
    小P聊技术 2021-06-01 11:14
    System.out.println(Double.MAX_VALUE); //2的1024次方-1,308个数位,是float数位的10倍,主要用来做复杂运算和天文运算 
    System.out.println(Double.MIN_VALUE); //2的-1074次方 
    点赞 评论

相关推荐