Java中Double类型的求和问题

时间:2013-06-17 07:21:25

标签: java double core

我有一个示例sop line:

 System.out.println(0.0000877979+0.3067846127);

以上行的输出为:0.30687241060000003

但预期的是:0.3068724106

我怀疑,为什么终于来了0000003

5 个答案:

答案 0 :(得分:7)

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

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

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

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

构建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开始,或者可能是整数。

答案 1 :(得分:4)

这是因为在二进制环境中使用浮点运算。请查看此IEEE 754标准以获取更多信息。

你应该使用BigDecimal类进行切割。

使用BigDecimal.valueOf(value)double转换为BigDecimal

  

使用Double.toString(double)方法提供的double的规范字符串表示将double转换为BigDecimal。

答案 2 :(得分:3)

这是正常的,因为浮点数的性质有限(Java中为floatdouble)。请了解浮点算术(IEEE 754)。

要获得确切的数字,请在Java中使用BigDecimal

答案 3 :(得分:0)

BigDecimal bd = new BigDecimal(0.0000877979);
BigDecimal bd1 = new BigDecimal(0.3067846127);
System.out.print(bd.add(bd1).setScale(10,0));

答案 4 :(得分:0)

要获得准确的结果,您可以尝试这样做,

BigDecimal b1= BigDecimal.valueOf(0.0000877979);
BigDecimal b2= BigDecimal.valueOf(0.3067846127);
System.out.println(b1.add(b2));