Я рассматриваю возможность записи двух ограниченных прецизионных альтернатив BigDecimal, а именно DecimalInt и DecimalLong. Они могли бы иметь дело с числами внутри реальных границ int и long с произвольным числом десятичных знаков, которые были бы созданы как в изменяемой, так и неизменной форме. Мой план состоит в том, чтобы сделать поддержку DecimalInt +/- 999,999,999 до +/- 0,999999999 и DecimalLong той же, но с до 18 цифрами.
Это можно было бы сделать, сохранив десятичное число с цифрой 0-9 для DecimalInt и 0-18 для DecimalLong вместе с фактическим значением, сохраненным как масштабированный int или long. Обычное использование было бы для небольшого количества десятичных знаков, например, для денег и цен на акции, обычно в 2-4 десятичных разряда.
Существенными требованиями являются (a) бережливый след (2 класса, плюс OverflowException) и (b) полная поддержка всех основных операций плюс вся математика, которая имеет смысл.
Поход по результатам не возвращал никаких очевидных ударов - все они, казалось, относились к произвольным десятичным знакам.
Мои вопросы: это уже сделано? Существуют ли скрытые тонкости в этом, почему это еще не сделано? Кто-нибудь слышал слухи о Java, поддерживающие десятичный тип, например DotNet.
EDIT: это отличается от BigDecimal, потому что он должен быть (a) чертовски более эффективным, чтобы не иметь дело с массивом ints, и (b) он не будет обертывать BigInteger, поэтому он будет более компактным по памяти и (c) он будет иметь изменяемый вариант, поэтому он будет быстрее и там. В итоге - меньше накладных расходов для простых случаев использования, таких как "Я хочу хранить баланс банка без накладных расходов BigDecimal и неточности двойного".
EDIT: Я намереваюсь выполнять всю математику с использованием int или long, чтобы избежать классической проблемы: 1586.60-708.75 = 877.8499999999999 вместо 877.85