Java中Double转换大数字出现精度丢失或者错误

新手上路,请多包涵

Double转换大数字出现精度丢失或者错误,如18位或以上的数字超过100000000000000000打印出来就会出现错误,用BigDecimal或者BigInteger能解决问题,Double的最大值也远远超过这个了呀,想知道为啥Double类型为什么会这种情况?

    NumberFormat nf = NumberFormat.getInstance();
    nf.setGroupingUsed(false);
    System.out.println(nf.format(Double.valueOf("100000000000000000")));//100000000000000000
    System.out.println(nf.format(Double.valueOf("100000000000000001")));//100000000000000000
    System.out.println(nf.format(Double.parseDouble("100000000000000216")));//100000000000000224
    System.out.println(new BigDecimal("100000000000000216"));//100000000000000216
阅读 4.1k
4 个回答

double是科学计数法存数字的

不是所有最大最小值之间的数都能精确表示. 有限个字节显然不可能表示无限精度 (这个集合甚至不可数).

double是二进制的存储,一些看起来是整数的东西,通过二进制的科学计数法表示起来就变成无限小数了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题