Альтернативы десятичным дробям произвольной точности в J2ME

Мы вносим некоторые изменения в устаревший проект с использованием J2ME. До сих пор десятичные числа обрабатывались как строки, поскольку не требовалось никаких арифметических операций. Значения отображались только как текст.

Теперь требуется арифметика произвольной точности. Если бы это была Java SE, я бы использовал BigDecimal, но его нет в API MIDP/CLDC.

Я пытался разработать свой собственный класс DecimalNumber, но пока исправлял некоторые ошибки и обнаруживал новые в модульных тестах, я понял, что потребуется некоторое время, чтобы сделать этот класс надежным и безошибочным.

Итак, вместо того, чтобы изобретать велосипед, какие альтернативы я мог бы повторно использовать для этой цели? Например, можно ли портировать классы BigInteger и BigDecimal в J2ME (CLDC1.1)? Я читал по другому вопросу, что кто-то пытается портировать BigDecimal JavaSE с BigInteger bouncycastle. Совместимы ли они?

Любая помощь будет оценена.


person Mister Smith    schedule 01.12.2011    source источник


Ответы (2)


Рассматривали ли вы вариант реализации Harmony (см. здесь)? Вероятно, ему потребуется некоторая очистка, поскольку, к сожалению, он НЕ является бесплатным, но он доступен для вас.

person Femi    schedule 13.12.2011
comment
Спасибо за предложение, я не знал об этой реализации. Тем не менее, он такой же большой, как и официальный, поэтому это будет примерно такое же усилие. - person Mister Smith; 14.12.2011

Я успешно портировал JavaSE BigDecimal. Мне пришлось портировать и эти другие классы:

  • Сопоставимые
  • Число
  • BigInteger
  • BitSieve
  • МутабельныйБигИнтегер
  • SignedMutableBigInteger

По сути, мне пришлось удалить дженерики, некоторые методы сериализации, почти все методы в BigInteger, связанные с простыми числами, и заменить int[].clone() аналогичным методом. Также настраиваю методы compareTo.

Моя цель состояла в том, чтобы просто добиться произвольной точности и преобразовать из String в BigDecimal, мне больше ничего не нужно.

ОБНОВЛЕНИЕ: Не работает!!! Кажется, что при извлечении исходного кода я смешал классы из разных источников (одни были из OpenJDK, Oracle JavaSE,...). Все это было для Java 6, но я заметил некоторые серьезные изменения между различными версиями. Выяснилось, что они плохо взаимодействуют друг с другом (или некоторые из них содержат серьезные ошибки, но я так не думаю), поэтому порт был БОЛЬШИМ провалом. Мне нужно решить эту проблему как можно скорее, поэтому сейчас я ищу следующие альтернативы:

  • Paypal выпустил API мобильных платежей. Библиотека BlackBerry содержит порт BigDecimal. Это не OpenSource, и классы были запутаны, но на данный момент я могу сказать, что он работает правильно. Нужны только три файла классов. Я ожидаю, что он будет тщательно протестирован, поскольку это материал Paypal (по крайней мере, я на это надеюсь).
  • Также есть SimpleBigDecimal от bouncycastle, но он не такой мощный, как Paypal или Java. Меня интересовал конструктор String, которого нет в этом классе.
  • Я думаю, что порт с JavaSE будет проще, используя JavaSE v1.4.2. Поскольку у него нет универсальных шаблонов, его разработка может быть быстрее, но я не хочу идти на это, потому что я думаю, что эти старые классы, вероятно, не так надежны, как новые в 1.6 или 1.7.
  • Я мог бы реализовать свой собственный сокращенный класс для заданной шкалы (1 или, может быть, 2 десятичных знака) и сокращенный набор методов (в основном сравнение, сложение и вычитание), но вы знаете, я хотел бы иметь более общее решение, а не просто быстрый обходной путь.

ОБНОВЛЕНИЕ:
Наконец-то я воспользовался портом PayPal BigDecimal, содержащимся в их библиотеке мобильных платежей для BlackBerry. BlackBerry основан на J2ME, поэтому идеально подходит для этой задачи. Я выполнил значительное количество модульных тестов и могу сказать, что это согласуется с поведением BigDecimal в JavaSE.

person Mister Smith    schedule 02.12.2011