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

Rya*_*des 14 java api bigdecimal

我注意到这个构造函数有很大的痛苦(即使在Stack Overflow上也是如此).人们使用它,即使文档明确指出:

这个构造函数的结果可能有点不可预测 http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal(double)

我甚至看到JSR-13批准了一条建议,说明:

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

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

我很想听到有关这方面的任何看法.

coo*_*ird 20

考虑到行为BigDecimal(double)是正确的,在我看来,我不太确定它真的会出现这样的问题.

我不完全同意BigDecimal(double)构造函数中文档的措辞:

这个构造函数的结果可能有点不可预测.有人可能会认为new BigDecimal(0.1)用Java 编写会创建一个 BigDecimal完全等于 0.1(未缩放的值1,带有比例1),但它实际上等于 0.1000000000000000055511151231257827021181583404541015625.

(重点补充.)

我认为措辞应该是出乎意料的,而不是说不可预测,即便如此,对于那些不了解带有浮点值的十进制数表示的局限性的人来说,这也是意想不到的行为.

只要一个人守记住,浮点值不能代表精确所有十进制值,该值通过返回的BigDecimal(0.1)0.1000000000000000055511151231257827021181583404541015625实际上是有意义的.

如果构造函数BigDecimal实例化的对象BigDecimal(double)是一致的,那么我认为结果是可预测的.

我猜测为什么BigDecimal(double)构造函数不被弃用是因为行为可以被认为是正确的,只要知道浮点表示如何工作,构造函数的行为就不会太令人惊讶.

  • 遵循该推理(不仅)必须尽快删除double和float (2认同)

Tom*_*ine 3

弃用已弃用。仅在特殊情况下,部分 API 才会被标记为已弃用。

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

  • 为什么弃用被弃用?我刚刚找到http://docs.oracle.com/javase/7/docs/technotes/guides/javadoc/deprecation/deprecation.html,它没有说明这一点。 (3认同)