在java中求和Double类型的问题

Nir*_*rma 1 java double core

我有一个宽松的线路:

 System.out.println(0.0000877979+0.3067846127);
Run Code Online (Sandbox Code Playgroud)

以上行的输出是: 0.30687241060000003

但预期的是: 0.3068724106

我怀疑,0000003最后是怎么来的.

Jon*_*eet 7

您需要了解double数字是什么:它是一个二进制浮点数.因此,它不能完全代表所有十进制数.例如,取数字0.2.没有有限的二进制表示 - 就像没有1/3的有限十进制表示一样.

如果您对十进制数字感兴趣,那么您应该使用BigDecimal.但是,这可能实际上并不适合您要实现的目标.这个数字对你的情况意味着什么?它们是从自然属性(重量,高度等)测量的值还是"人为的",自然的十进制值,如金融的?这会影响您应该使用的类型.

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

  • 它支持任意精度(基本上你有内存的数字)
  • 它有一个浮点小数点而不是浮点二进制点.因此,虽然它仍然不能完全代表"第三个",但它可以精确地表示十进制值.
  • 它是一种类型而不是原始类型.就可以表示的数字而言,这并不重要,但重要的是要理解这两种类型之间的差异.

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

BigDecimal bd1 = new BigDecimal("0.0000877979");
BigDecimal bd2 = new BigDecimal("0.3067846127");
System.out.println(bd1.add(bd2)); // Prints 0.3068724106
Run Code Online (Sandbox Code Playgroud)

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