2

我们正在使用 J2ME 对遗留项目进行一些修改。到目前为止,十进制数被视为字符串,因为不需要算术运算。这些值仅显示为文本。

现在,需要任意精度的算术。如果它是 Java SE,我会使用BigDecimal,但它不存在于 MIDP/CLDC API 中。

我试图制定我的自定义 DecimalNumber 类,但是当我在单元测试中修复一些错误并发现新错误时,我意识到需要一些时间来使这个类坚如磐石并且没有错误。

那么,与其重新发明轮子,我可以为此目的重复使用哪些替代方案?例如,BigIntegerandBigDecimal类可以移植到 J2ME (CLDC1.1) 吗?我读过其他问题,有人试图用 bouncycastle 移植BigDecimalJavaSE BigInteger。这些兼容吗?

任何帮助将不胜感激。

4

2 回答 2

1

我成功移植了 JavaSE 的BigDecimal. 我还必须移植这些其他类:

  • 可比
  • 数字
  • 大整数
  • 比特筛
  • 可变大整数
  • 有符号可变大整数

基本上我不得不删除泛型,一些序列化方法,几乎​​所有BigInteger与素数相关的方法,并int[].clone()用类似的方法替换。也在调整compareTo方法。

我的目标只是实现任意精度并将 String 转换为 BigDecimal,我真的不需要其他任何东西。

更新:不工作!!! 似乎在检索源代码时,我混合了来自不同来源的类(来自 OpenJDK、Oracle JavaSE 等)。这些都是针对 Java 6 的,但我注意到不同版本之间的一些重大变化。事实证明,它们的互操作性不好(或者其中一些包含严重的错误,但我不这么认为),因此该端口是一个很大的失败。我需要尽快解决这个问题,所以现在我正在寻找以下替代方案:

  • Paypal 已发布移动支付 API。BlackBerry 库包含一个 BigDecimal 端口。它不是开源的,而且这些类已经被混淆了,但至于现在我可以说它工作正常。只需要三个类文件。我希望它已经过彻底的测试,是 Paypal 的东西(至少我希望如此)。
  • 还有 bouncycastle 的 SimpleBigDecimal,但它不如 Paypal 或 Java 的强大。我对拥有一个此类不提供的 String 构造函数很感兴趣。
  • 我猜 JavaSE 的移植使用 JavaSE v1.4.2 会更容易。由于它没有泛型,因此开发起来可能更快,但我不愿意这样做,因为我认为这些旧类可能不如 1.6 或 1.7 中的新类强大
  • 我可以为给定的比例(1 个或 2 个小数)和一个简化的方法集(基本上是比较、加法和减法)实现我自己的简化类,但你知道,我想要一个更通用的解决方案,而不仅仅是一个快速的解决方法。

更新:
我终于使用了 PayPal 的 BigDecimal 端口,该端口包含在他们的黑莓移动支付库中。BlackBerry 基于 J2ME,因此非常适合这项任务。我已经对它进行了大量的单元测试,我可以说它与 JavaSE 的 BigDecimal 的行为是一致的。

于 2011-12-02T09:29:37.050 回答
1

您是否考虑过采用 Harmony 实现(请参见此处)?它可能需要一些清理,因为不幸的是它不是通用的,但它就在那里。

于 2011-12-13T22:26:32.253 回答