【问题标题】:Sum proble of Double type in java [duplicate]java中Double类型的求和问题[重复]
【发布时间】:2013-06-17 07:21:24
【问题描述】:

我有一个简单的 sop 行:

 System.out.println(0.0000877979+0.3067846127);

上面一行的输出是:0.30687241060000003

但预期是:0.3068724106

我怀疑,怎么又来了0000003

【问题讨论】:

标签: java double core


【解决方案1】:

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

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

BigDecimaldouble 在三个重要方面不同:

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

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

【讨论】:

  • 谢谢...它们是人工类型。我应该选择 BigDecimal
  • @NirdeshSharma:是的,这是有道理的。
【解决方案2】:

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

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

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

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

【讨论】:

  • +1。你更快;)
  • 二进制部分是这里的重要部分。 double 可以随心所欲,但仍然无法准确表示 0.1。
  • double 转换为 BigDecimal 可能是个坏主意 - 你想从原始 string 表示进行转换,否则你已经丢失信息。
【解决方案3】:

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

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

【讨论】:

  • BigDecimal 也是浮点类型。重要的部分是类型的 base(事实上 BigDecimal 是任意精度,但基数更重要)。
  • @JonSkeet 根据您的评论扩展了我的回答。
【解决方案4】:
BigDecimal bd = new BigDecimal(0.0000877979);
BigDecimal bd1 = new BigDecimal(0.3067846127);
System.out.print(bd.add(bd1).setScale(10,0));

【讨论】:

  • 不!如果你使用以doubles 作为参数的构造函数,你就会陷入double的不精确的陷阱!
  • 这将产生 0.3068724107 但我想要 0.3068724106
  • System.out.print(bd.add(bd1).setScale(10,1));
【解决方案5】:

要得到确切的结果,你可以这样尝试,

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

【讨论】:

    猜你喜欢
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多