2

J2ME を使用してレガシー プロジェクトにいくつかの変更を加えています。これまでは、算術演算が不要だったため、10 進数は文字列として扱われていました。値はテキストとしてのみ表示されました。

現在、任意精度の演算が必要です。Java SE の場合は を使用しますBigDecimalが、MIDP/CLDC API にはありません。

カスタムの DecimalNumber クラスを作成しようとしていましたが、いくつかのバグを修正し、単体テストで新しいバグを発見しているうちに、このクラスを堅牢でエラーのないものにするのに時間がかかることに気付きました。

では、車輪を再発明する代わりに、この目的のためにどの代替手段を再利用できるでしょうか? たとえば、BigIntegerおよびBigDecimalクラスを J2ME (CLDC1.1) に移植できますか? BigDecimalJavaSEを bouncycastle で移植しようとしている他の質問を読みましたBigInteger。これらは互換性がありますか?

どんな助けでも大歓迎です。

4

2 に答える 2

1

JavaSE の の移植に成功しましたBigDecimal。これらの他のクラスも移植する必要がありました。

  • 同程度の
  • 番号
  • BigInteger
  • ビットシーブ
  • MutableBigInteger
  • SignedMutableBigInteger

基本的に、ジェネリック、いくつかのシリアル化メソッド、素数に関連するほぼすべてのメソッドを削除し、同様のメソッドBigIntegerに置き換える必要がありました。メソッドint[].clone()の微調整も。compareTo

私の目標は、任意の精度を達成し、String から BigDecimal に変換することだけでした。他には何も必要ありませんでした。

更新:機能していません!!! ソースコードを取得するときに、さまざまなソースのクラスを混合したようです (OpenJDK、Oracle JavaSE などからのクラス)。これらはすべて Java 6 用でしたが、異なるバージョン リリース間で大きな変更がいくつかあることに気付きました。それらはうまく相互運用されていないことが判明したため (または、それらのいくつかに深刻なバグが含まれていますが、私はそうは思いません)、移植は大きな失敗に終わりました。これをできるだけ早く解決する必要があるため、次の代替手段を探しています。

  • Paypal は Mobile Payment API をリリースしました。BlackBerry ライブラリには BigDecimal ポートが含まれています。OpenSource ではなく、クラスが難読化されていますが、今のところ正常に動作していると言えます。必要なクラス ファイルは 3 つだけです。Paypalのものなので、徹底的にテストされていると思います(少なくともそう願っています)。
  • bouncycastle の SimpleBigDecimal もありますが、Paypal や Java ほど強力ではありません。このクラスが提供しない String コンストラクターを持つことに興味がありました。
  • JavaSE v1.4.2を使用すると、JavaSEからの移植が簡単になると思います。Generics がないため、開発が速いかもしれませんが、これらの古いクラスは 1.6 または 1.7 の新しいクラスほど堅牢ではない可能性があるため、これには乗り気ではありません。
  • 特定のスケール (1 桁または 2 桁) と縮小されたメソッド セット (基本的には比較、加算、減算) に対して独自の縮小クラスを実装できますが、より一般的なソリューションが必要です。簡単な回避策。

更新:
最後に、BlackBerry 用の Mobility Payment Library に含まれている PayPal の BigDecimal ポートを使用しました。BlackBerry は J2ME に基づいているため、このタスクに最適です。かなりの量の単体テストを行いましたが、JavaSE の BigDecimal の動作と一致していると言えます。

于 2011-12-02T09:29:37.050 に答える
1

Harmony の実装を検討したことはありますか (こちらを参照)。残念ながらジェネリックフリーではないため、おそらくクリーンアップが必要になるでしょうが、あなたのためにそこにあります.

于 2011-12-13T22:26:32.253 に答える