J2MEの任意の前科の小数の代替案
-
27-10-2019 - |
質問
J2MEを使用して、レガシープロジェクトにいくつかの変更を加えています。これまで、算術操作が不要であるため、小数点以降は文字列として扱われていました。値はテキストとしてのみ表示されました。
これで、任意の前提条件算術が必要です。それがJava SEであれば、私は使用します BigDecimal
, 、しかし、それはMIDP/CLDC APIには存在しません。
私はカスタムDecimalNumberクラスを解決しようとしていましたが、いくつかのバグを修正し、ユニットテストで新しいバグを発見している間、このクラスをロックソリッドとエラーなしにする時間があることに気付きました。
それで、ホイールを再発明する代わりに、この目的のためにどのような選択肢を再利用できますか?たとえば、 BigInteger
と BigDecimal
クラスはJ2ME(CLDC1.1)に移植されますか?私は他の質問で読んだ誰かがJavaseをポートしようとしている BigDecimal
bouncycastleの BigInteger
. 。これらは互換性がありますか?
どんな助けも感謝します。
解決 2
Javaseの移植に成功しました BigDecimal
. 。私はこれらの他のクラスもポートしなければなりませんでした:
- 同程度の
- 番号
- biginteger
- ビットーブ
- MutableBiginteger
- SignedMutableBiginteger
基本的に、ジェネリック、いくつかのシリアル化方法を削除する必要がありました。 BigInteger
プライムに関連し、交換します int[].clone()
同様の方法で。また、微調整します compareTo
方法。
私の目標は、任意の前提を達成し、文字列からBigDecimalに変換することでしたが、他に何も必要ありませんでした。
アップデート: 働いていない!!!ソースコードを取得するとき、私はさまざまなソースからクラスを混合したようです(それはOpenJDK、Oracle Javaseからのものでした...)。これらはすべてJava 6向けでしたが、異なるバージョンリリースの間にいくつかの大きな変化に気付きました。彼らはうまく相互運用していないことがわかります(または、それらのいくつかは深刻なバグを含んでいますが、私はそうは思いません)ので、ポートは大きな失敗でした。私はこれをできるだけ早く解決する必要があるので、今私は次の選択肢を探しています:
- PayPalはモバイル決済APIをリリースしました。 BlackBerryライブラリには、大規模なポートが含まれています。それはOpenSourceではなく、クラスは難読化されていますが、今に関してはそれが適切に機能していると言えます。 3つのクラスファイルのみが必要です。私はそれが徹底的にテストされ、PayPalのものであることを期待しています(少なくともそう願っています)。
- BouncycastleのSimplebigdecimalもありますが、PaypalやJavaのように強力ではありません。私はこのクラスが提供していない文字列コンストラクターを持っていることに興味がありました。
- Javase V1.4.2を使用してJavaseのポートが簡単になると思います。ジェネリックがないため、開発する方が速いかもしれませんが、これらの古いクラスはおそらく1.6または1.7の新しいクラスほど堅牢ではないと思うので、私はこれに行くことを嫌がります。
- 特定のスケール(1つまたは2つの小数)と縮小メソッドセット(基本的に比較、追加、サブラクト)で独自のクラスを実装できますが、ご存知のように、より一般的なソリューションを持ちたいだけでなく、簡単な回避策。
アップデート:
私はついに、BlackBerryのモビリティ支払いライブラリに含まれるPayPalのBigDecimalポートを使用しました。 BlackBerryはJ2MEに基づいているため、タスクに最適です。私はそれについてかなりの量の単体テストを作成しました、そして、それはJavaseのBigDecimalの挙動と一致していると言えます。
他のヒント
ハーモニーの実装を手に入れることを検討しましたか(参照してください ここ)?残念ながらジェネリックフリーではなく、あなたのためにそこにあるので、おそらくクリーンアップが必要になるでしょう。