Поддержание точности
Существует несколько способов поддержания точности.Во-первых, полностью избегает типов двоичных чисел с плавающей точкой фиксированной точности, таких как float
s и double
s , если ваша валюта использует десятичные цифры после точки.Вот несколько хороших альтернатив:
BigDecimal
java.math.BigDecimal
позволяет с легкостью хранить точные конечные десятичные значения, но это может быть немногомедленно.
Используйте BigDecimal
s, если вам нужно, чтобы программирование было легким, а результаты - точными, но с медлительностью все в порядке.
long
long
можно использовать для хранения суммы в центах, а не в долларах, если вы используете валюту США.
Для других валют вы можете взять обратную величину рационального GCD для деноминаций и умножить всекогда вы его сохраните.
В замешательстве?Вот пример того, как Wolfram | Alpha проделала всю тяжелую работу по выяснению по имеющимся номиналам американской валюты (от 1/100 до 100 долларов), что она должна умножить валюту США на 100 .Обязательно используйте дроби, а не десятичные дроби.
Используйте long
s, если вам нужна большая скорость и вы согласны с тем недостатком, что денежные суммы, превышающие 92 233 720 368 547 758,0 долл. США, дают совершенно неверные результаты.
Помимо того, что они быстрые сами по себе, long
также используют намного меньше памяти и никогда не требуют сборки мусора сами по себе, так что это еще одно небольшое ускорение для них.
BigInteger
long
s можно заменить на java.math.BigInteger
s , чтобы избежать каких-либо проблем переполнения.
Используйте это, если вы хотите что-то между скоростью и медлительностью двух других без достаточных шансовкогда-либо переполнен.