Альтернативы десятичной дроби произвольной точности в J2ME - PullRequest
2 голосов
/ 02 декабря 2011

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

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

1 голос
/ 02 декабря 2011

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

  • Сопоставимые
  • номер
  • BigInteger
  • BitSieve
  • MutableBigInteger
  • 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. Так как у него нет Generics, он может развиваться быстрее, но я не хочу этого делать, потому что я думаю, что эти старые классы, вероятно, не так надежны, как новые классы в 1.6 или 1.7
  • Я мог бы реализовать свой собственный сокращенный класс для заданного масштаба (1 или, может быть, 2 десятичных знака) и сокращенный набор методов (в основном сравнивать, добавлять и вычитать), но вы знаете, я хотел бы иметь более общее решение а не просто быстрый обходной путь.

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

...