java - Java中Double类型的总和

标签 java double

<分区>

我有一个简单的 sop 行:

 System.out.println(0.0000877979+0.3067846127);

上面一行的输出是:0.30687241060000003

但预期是:0.3068724106

我很疑惑,怎么最后又来了额外的0000003

最佳答案

您需要了解什么是double 数:它是二进制 float 。因此,它不能准确表示所有十进制 数字。例如,取数字 0.2。没有有限的二进制表示形式 - 就像没有 1/3 的有限十进制表示形式一样。

如果您对十进制数字 感兴趣,那么您应该使用BigDecimal。但是,这实际上可能不适合您要实现的目标。在您的案例中,数字表示是什么?它们是来自自然属性(体重、高度等)的测量值,还是“人工”的​​、自然的十进制值,例如金融值?这会影响您应该使用哪种类型。

BigDecimal 在三个重要方面不同于 double:

  • 它支持任意精度(基本上,只要你能记住多少位数)
  • 它有一个 float 十进制点而不是一个 float 二进制点。因此,虽然它仍然不能准确地表示“三分之一”,但它可以准确地表示十进制值。
  • 它是一个类类型而不是原始类型。就可以表示的数字而言,这并不重要,但重要的是要理解这两种类型之间的区别。

构造 BigDecimal 时,从准确的值开始很重要 - 将 double 转换为 BigDecimal 几乎总是错误的。因此,如果您将用户输入作为文本,那很好:

BigDecimal bd1 = new BigDecimal("0.0000877979");
BigDecimal bd2 = new BigDecimal("0.3067846127");
System.out.println(bd1.add(bd2)); // Prints 0.3068724106

在其他情况下,您可以从另一个 BigDecimal 开始,或者可能是一个整数。

关于java - Java中Double类型的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17142280/

相关文章:

java - 如何在数组中设置 double 类型的值

java - Java 中原始类型的子类型化

java - 无法在 Spring 返回带有异常详细信息的 ResponseEntity

用于条码扫描器的 Java 库?

java - 如何将动态列数据导出到excel

java - Firebase 中的 Android Studio 值(value)增量

java - Java 中的返回类型问题

c++ - 双变量之和

c++ - 异或两个双变量

java - 在没有正则表达式的情况下将 double 表示为整数