2009-06-29 73 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

相關問題