当前位置: 首页 > 面试题库 >

为什么将Double.parseDouble设置为9999999999999999到10000000000000000?

穆修杰
2023-03-14
问题内容

为什么将Double.parseDouble制作999999999999999910000000000000000?例如 :

Double d =Double.parseDouble("9999999999999999");
String b= new DecimalFormat("#.##").format(d);
System.out.println(b);

IS印刷

10000000000000000

相反,它必须显示99999999999999999999999999999999.00

任何帮助都将不胜感激。


问题答案:

double 仅具有15/16位数的精度,当您给它提供一个数字时,它就无法表示(多数情况下,甚至0.1都不是精度),它将采用最接近的可表示数字。

如果要9999999999999999精确表示,则需要使用BigDecimal。

BigDecimal bd = new BigDecimal("9999999999999999");
System.out.println(new DecimalFormat("#.##").format(bd));

版画

9999999999999999

现实世界中很少有问题需要这种准确性,因为您无论如何都无法准确地进行测量。即每百万分之一的误差。

您可以找到最大的可表示整数

// search all the powers of 2 until  (x + 1) - x != 1
for (long l = 1; l > 0; l <<= 1) {
    double d0 = l;
    double d1 = l + 1;
    if (d1 - d0 != 1) {
        System.out.println("Cannot represent " + (l + 1) + " was " + d1);
        break;
    }
}

版画

Cannot represent 9007199254740993 was 9.007199254740992E15

可表示的最大整数是9007199254740992,因为它需要少一位(偶数)



 类似资料:
  • 我刚刚安装了Ubuntu desktop 12.04并通过以下方式安装了Java 6 JDK: 但是当我转到时,我没有看到一个名为的目录,所以我认为它根本不存在!?! 当我转到时,我看到: 我现在正试图将作为环境变量添加到中,以便从基于shell的Ant构建中访问它: ? ? 还有别的吗? 我所说的“”是指我在系统上安装的JDK6的顶级目录,无论它在哪里······

  • 问题内容: 我一直想知道为什么JDBC API提供了自动提交模式()。似乎很吸引人的麻烦只是诱使人们陷入麻烦。我的理论是,仅将其添加到JDBC是为了简化希望创建使用JDBC编辑和运行SQL的工具的供应商的生活。是否有其他原因打开自动提交,还是总是错误? 问题答案: 不幸的是,使用自动提交是特定于数据库的(事务行为也是如此)。我认为,如果您没有全局的程序化交易策略,自动提交可能比仅希望每个人都正确关

  • 我不得不问这是一个好的做法吗?好心地建议使用它的优点和缺点(利弊)。

  • 我最近一直在学习Android系统,我有一个关于新Android系统库的问题。据我所知,AndroidX只是对支持库的一个新升级,其重点是为早期的Android SDK提供向后兼容性。 但是,Google要求"如果你想在一个新项目中使用AndroidX,你需要将编译SDK设置为Android 9.0(API级别28)或更高版本"。我在这里感到困惑。这是否意味着AndroidX实际上使用了一些仅在A

  • 问题内容: 我已经阅读了文档。但我仍然不确定何时不需要将其设置为。在下面的代码中,如果将其设置为,则根本看不到标题。如果我将其保留为,那么一切都很好。 View调试层次结构中的以下内容将给出警告“ 宽度 和 位置 不明确”。 我以为只要需要修改代码中的任何内容,都必须设置为。 如果您需要删除其所有约束,然后将其设置为,然后添加所需的内容,则可能是更正确的说法,在这种情况下,您需要为所有四个方面添加

  • 代码A来自项目,您可以看到它。 我不知道作者为什么将设计为,这是因为代码不太复杂,被多次调用。 我认为代码B可以很好地工作,对吗? 代码B