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

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条)

报告相同问题?

悬赏问题

  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥15 (关键词-阻抗匹配,HFSS,RFID标签天线)
  • ¥15 机器人轨迹规划相关问题
  • ¥15 word样式右侧翻页键消失