2013-04-26 123 views
1

我正在嘗試對JAVA + SQL中精確計算的選項建立一些簡明概述。到目前爲止,我已經找到以下選項:Java精確計算 - 使用選項

  1. 使用雙打接受他們的缺點,沒有去。在複雜的公式使用它們
  2. 使用BigDecimals的
    • 對我來說是有問題的
  3. 使用的String.format/Decimal.format圓雙打
    • 我需要四捨五入每個變量式或只是結果得到BigDecimal精度?
    • 這怎麼調整?
  4. 使用SQL中的計算字段選項。
    • 的缺點是,我需要動態SQL從不同的表中取出數據+計算上的其他計算領域和領域將變得混亂

任何其他的選擇嗎?

問題聲明: 我需要精確的財務計算,其中涉及使用非常大(十億)和非常小的數字(0.0000004321),並且還將彼此非常相似的值相除,所以我確定需要精確度爲BigDecimal 。另一方面,我想保留在函數中加倍的易用性(我使用十進制SQL數據處理數組),所以計算如下:(a [i] - b [i])/ b [ i]等等,它們在其他計算中被進一步使用。我希望用戶能夠根據需要設計自己的公式(使用常見的數學語句)

我非常希望爲String.format使用「格式」解決方案,但這會使代碼不夠可讀(對每個變量使用String.format()...)。

非常感謝您對如何處理這些東西的建議。

+0

這可能有助於... http://stackoverflow.com/questions/8636228/bigdecimal-notation-eclipse-plugin-or-nice-external-tool – Maxx 2013-04-26 10:39:43

+0

您的要求設計打破,回去分析階段。任何財務資料,如果沒有固定的,強制性的和詳盡的定義,以及如何實施捨入,那麼第一個或第二個人就會認爲它是錯誤的*。 – Durandal 2013-04-26 13:39:42

回答

0

double沒有辦法獲得BigDecimal精度。 double s具有雙精度。

如果你想保證精確的結果使用BigDecimal

可以使用long存儲的整數部分創建自己的變體和int存儲小數部分 - 但爲什麼推倒重來。

任何時間使用double s你站在雙精度問題的填充。如果你在一個地方使用它們,你不妨在任何地方使用它們。

即使您僅使用它們來表示來自數據庫的數據,也會將數據舍入爲雙精度,並且您將丟失信息。

2

什麼可以做,以避免在浮動浮點錯誤回報。 這裏沒有免費的奶酪 - 使用BigDecimal。

+0

+1「免費奶酪」。 – 2013-04-26 10:32:16

+0

@Eugene,好的,謝謝你的評論,但是讓我們挑戰BigDecimals吧。下面的示例代碼需要什麼才能起作用? //我知道這是不正確的語法,但我想這樣; BigDecimal a = 1234.59053232; BigDecimal b = 1.000054530; BigDecimal c; c = a/b; //或任何其他具有'人性'友好語法的公式? 並在輸出得到準確的值與c給定的精度讓我們說4位數? – mtx 2013-04-26 12:48:18

+0

@mtx你可以在BigDecimal上隱藏這個操作。常見的數學語句可以映射到ENUM,並提供如下操作:DIVIDE,SQUARE等。您不能在非人類BigDecimal類型上使用人類語法。在你的例子中,除法操作看起來像這樣* a.divide(b,4,RoundingMode.HALF_UP)* – Eugene 2013-04-26 13:00:22

0

如果我理解你的問題,你希望使用數據類型比本地Java更精確,而不會丟失簡單的數學語法(例如/ + * - 等等)。因爲你不能在Java中重載運算符,所以我認爲這是不可能的。

1

有效的Java(第2版):

項目48:如果確切的答案需要

  • float和double不能提供準確的結果,避免float和double和不要在需要確切結果的地方使用。 float和double類型特別不適合貨幣分類,因爲不可能將0.1(或10的任何其他負數)表示爲float或double。

  • 解決此問題的正確方法是對BigDecimal,int或long進行貨幣計算。

...

另一種方法是使用int或長,並跟蹤小數點自己。