J2ME中任意精度小数的替代方法

时间:2011-12-01 21:55:45

标签: java java-me bigdecimal arbitrary-precision cldc

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

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

我试图找出我的自定义DecimalNumber类,但是当我修复一些错误并在单元测试中发现新错误时,我意识到它会花一些时间让这个类坚如磐石而且没有错误。

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

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我成功移植了JavaSE的BigDecimal。我不得不移植其他类:

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

基本上我必须删除泛型,一些序列化方法,几乎​​BigInteger中与素数相关的每个方法,并用类似的方法替换int[].clone()。同时调整compareTo方法。

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

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

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

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

答案 1 :(得分:1)

您是否考虑过阻止Harmony实施(请参阅here)?它可能需要一些清理,因为它很遗憾不是通用的,但它可以帮助你。