2009-06-29 76 views
13

我注意到了这个构造函数的实质性痛苦(即使在Stack Overflow)。人们使用它,即使该文件明确规定:为什么Bigdecimal(double d)构造还在?

此构造方法的结果有一定的不可预知 http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal(double)

我甚至看到了JSR-13APPROVED并建议指出:

可能会被弃用的现有规范:我们建议弃用BigDec imal(double)构造函数,它目前给出的结果与Double.toString()方法不同。

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

我很想听听任何意见。

回答

2

不推荐使用弃用。在特殊情况下,部分API仅被标记为弃用。

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

1

与所有浮点运算一样,该特定构造函数是近似值。它并没有被打破,它只是有缺点。
只要做你的研究,小心处理,你不会得到任何意外。将十进制文字分配给双精度浮点数时,会遇到完全相同的结果。

+2

好点,它就像一个毫无戒心的开发者的地雷。长远来看,地雷从来不会为任何人服务......这就是为什么JSR我猜... – 2009-06-29 05:59:30

18

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

我不会正好与在BigDecimal(double)构造的文件的措辞达成一致:

此构造方法的结果可能会有所 不可预知。有人可能会 认为用Java编写new BigDecimal(0.1)创建 BigDecimal这正好等于 0.1(的1未测量的值,用1规模),但它实际上等于 是 0.1000000000000000055511151231257827021181583404541015625

(着重号。)

与其说不可预知,我觉得写法应该是意外,即使如此,这将是对于那些谁不知道的局限性,意外行为用floating point values表示十进制数字。

只要记住浮点值不能精确地表示所有十进制值,使用BigDecimal(0.1)0.1000000000000000055511151231257827021181583404541015625返回的值实际上是有意义的。

如果由BigDecimal(double)构造函数实例化的对象BigDecimal是一致的,那么我会争辩说结果是可预测的。

我为什么不推荐使用BigDecimal(double)构造函数是因为行为可以被认为是正确的,并且只要知道浮点表示如何工作,构造函数的行为就不足为奇了。

+1

伟大的论据! “>只要有人知道浮点表示如何工作”......猜测这句话消除了〜95%的编程世界(可能更多)。防止95%的程序员造成数百万美元的会计错误可能是促使JSR-13推荐的原因:) – 2009-06-30 05:53:51

+2

遵循这个推理(不仅是)double和float必须被移除ASAP – 2009-07-21 11:17:07

相关问题