2011-12-01 35 views
2

我們正在使用J2ME對遺留項目進行一些修改。 到現在爲止,由於不需要算術運算,因此到目前爲止,十進制數被視爲字符串。這些值只顯示爲文本。J2ME中任意精度小數點的替代方案

現在,任意精度算術是必需的。如果它是Java SE,我會使用BigDecimal,但它不存在於MIDP/CLDC API中。

我正在試着制定我的自定義DecimalNumber類,但是當我修復一些錯誤並在單元測試中發現新的錯誤時,我意識到它會得到一些時間來使這個類變得堅如磐​​石,沒有錯誤。

因此,我可以重複使用哪些替代方案,而不是重新發明輪子?例如,BigIntegerBigDecimal類可以移植到J2ME(CLDC1.1)嗎?我讀過其他人的問題,有人試圖用bouncycastle的BigInteger移植JavaSE的BigDecimal。這些兼容嗎?

任何幫助將不勝感激。

回答

1

我成功移植了JavaSE的BigDecimal。我只好端口也是這些其他類:

  • 可比
  • 的BigInteger
  • BitSieve
  • MutableBigInteger
  • SignedMutableBigInteger

基本上,我不得不刪除仿製藥,一些序列化方法,幾乎​​所有方法都在BigInteger與素數相關,並用類似方法替換int[].clone()。還調整compareTo方法。

我的目標是實現任意精度並將字符串轉換爲BigDecimal,但我並不需要其他任何東西。

更新:不工作!!! 似乎在檢索源代碼時,我混合了來自不同源的類(其中一些來自OpenJDK,Oracle JavaSE,...)。這些都是針對Java 6的,但我注意到了不同版本發佈之間的一些重大變化。事實證明,它們並沒有良好的互操作性(或者它們中的一些包含嚴重的錯誤,但我不這麼認爲),所以這個端口一直是大失敗。我需要一個儘快解決這個問題,所以現在我正在尋找以下替代方案:

  • 貝寶已經發布了移動支付API。 BlackBerry庫包含一個BigDecimal端口。它不是OpenSource,並且這些類已被混淆,但至此我可以說它正常工作。只需要三個類文件。我期望它經過徹底的測試,成爲貝寶的東西(至少我希望如此)。
  • 還有bouncycastle的SimpleBigDecimal,但它沒有Paypal或Java那麼強大。我有興趣有一個String類的構造函數,這個類沒有提供。
  • 我想使用JavaSE v1.4.2可以更輕鬆地使用JavaSE的端口。由於它沒有泛型,開發起來可能會更快,但我不願意這樣做,因爲我認爲這些舊類可能不如1中的新類更健壯。6或1.7
  • 我可以爲給定的比例(1或2個小數)和簡化的方法集(比較,添加和減少,基本上)實現我自己的簡化類,但是你知道,我想有一個更通用的解決方案,而不僅僅是一個快速的解決方法。

UPDATE:
我終於用包含在其移動支付庫黑莓PayPal的BigDecimal的端口。 BlackBerry基於J2ME,因此它非常適合完成這項任務。我對它做了大量的單元測試,我可以說它與JavaSE的BigDecimal的行爲一致。

1

您是否考慮過和諧實現(請參閱here)?它可能需要一些清理,因爲它不幸沒有通用,但它在那裏爲你。

+0

感謝您的建議,我不知道該實施。然而,它和官方一樣大,所以它幾乎是同樣的努力。 –