1

我有一个简单的 sop 行:

 System.out.println(0.0000877979+0.3067846127);

上面一行的输出是:0.30687241060000003

但预期是:0.3068724106

我怀疑,为什么额外0000003的最后来了。

4

5 回答 5

7

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

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

BigDecimal区别于double三个重要方面:

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

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

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

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

于 2013-06-17T07:25:46.087 回答
4

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

您应该使用BigDecimal类进行计算。

使用BigDecimal.valueOf(value)将 转换doubleBigDecimal.

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

于 2013-06-17T07:22:55.707 回答
3

由于浮点数(float以及double在 Java 中)的有限性质,这是正常的。请了解浮点运算 (IEEE 754)。

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

于 2013-06-17T07:23:22.827 回答
0
BigDecimal bd = new BigDecimal(0.0000877979);
BigDecimal bd1 = new BigDecimal(0.3067846127);
System.out.print(bd.add(bd1).setScale(10,0));
于 2013-06-17T07:25:54.677 回答
0

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

BigDecimal b1= BigDecimal.valueOf(0.0000877979);
BigDecimal b2= BigDecimal.valueOf(0.3067846127);
System.out.println(b1.add(b2));
于 2013-06-17T08:04:39.157 回答