我注意到巨大的痛苦超过这个构造(甚至在这里堆溢)。人们使用它,虽然文件清楚地指出:

结果该构造可以有些不可预知的 http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal(double)

我甚至见到一个 JSR-13 正在 批准 有一项建议指出:

现有的规范,可能已过时:我们提出自嘲的BigDecimal(double)的构造,其目前的结果是不同的两倍。toString()方法。

尽管如此,该构造尚未被否决。

我很想听到任何风景,在这个。

有帮助吗?

解决方案

弃用被弃用。的API部分仅标记为弃用在特殊情况下。

所以,中运行FindBugs您的构建过程的一部分。 FindBugs的具有检测器插件API和也是开源(LGPL,这个)。

其他提示

考虑 BigDecimal(double)的行为是正确的,在我看来,我也不太清楚它的确会出现这样的问题。

我不会精确地与所述文档中的BigDecimal(double)构造的措辞同意:

  

此构造的结果可以是   稍微的不可预测即可。有人可能会   假设写作new BigDecimal(0.1)在Java中创建一个   BigDecimal这正好等于   0.11的未经换算的值,用1的规模),但它实际上等于   至   0.1000000000000000055511151231257827021181583404541015625

(着重。)

而不是说的不可预测的,我觉得写法应该是意外,即便如此,这将是对于那些谁不知道代表的局限性意外行为与浮点值。

只要一个保持记住,浮点值不能表示与精度所有十进制值

,通过使用BigDecimal(0.1)0.1000000000000000055511151231257827021181583404541015625返回的值实际上是有意义的。

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

我的,为什么BigDecimal(double)构造不被弃用的猜测是因为行为可以被认为是正确的,只要人知道点表示如何浮动工作,构造函数的行为是不是太奇怪了。

这特定的构造函数,像所有的浮点运算,是近似值。这不是真的坏,它只是有不足之处。结果 只要做你的研究,小心接近它,你不会得到任何惊喜。您对双打分配十进制文本时碰到同样的事情/花车。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top