代码之家  ›  专栏  ›  技术社区  ›  Ryan Fernandes

为什么Bigdecimal(双d)结构仍然存在?

  •  14
  • Ryan Fernandes  · 技术社区  · 17 年前

    我注意到这个构造函数带来了很大的痛苦(即使在堆栈溢出的情况下)。人们使用它,即使文档中明确指出:

    http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal(double)

    我甚至看过一部电影 JSR-13 存在 APPROVED 有一项建议指出:

    可能不推荐使用的现有规范:我们建议不推荐使用BigDecimal(double)构造函数,该构造函数当前给出的结果与double.toString()方法不同。

    尽管如此,构造函数还没有被弃用。

    我很想听听大家对这个问题的看法。

    3 回复  |  直到 14 年前
        1
  •  20
  •   coobird    17 年前

    考虑到 BigDecimal(double) 是正确的,在我看来,我不太确定这真的会是一个问题。

    我不完全同意文件中的措辞 BigDecimal(双精度) 建造商:

    有点 . 可能 假设写作 new BigDecimal(0.1) BigDecimal 这正好等于 0.1 (未标度的价值) 1 ,规模为 1. ),但实际上是相等的 到 0.1000000000000000055511151231257827021181583404541015625 .

    (重点加上。)

    而不是说 不可预知的 想不到的 ,即使如此,对于那些不知道用 floating point values .

    只要记住浮点值不能精确地表示所有的十进制值,使用 BigDecimal(0.1) 存在 实际上是有道理的。

    如果 大十进制 BigDecimal(双精度) 构造函数是一致的,那么我认为结果是可预测的。

    我猜这是为什么 构造函数没有被弃用是因为可以认为其行为是正确的,并且只要知道浮点表示法是如何工作的,构造函数的行为就不会太令人惊讶。

        2
  •  3
  •   Tom Hawtin - tackline    17 年前

    因此,在构建过程中运行FindBugs。FindBugs有一个检测器插件API,也是开源的(LGPL、IIRC)。

        3
  •  1
  •   mskfisher KeithS    14 年前

    与所有浮点运算一样,该特定构造函数是一个近似值。它不是真的坏了,只是有缺点。