Мне нужно прочитать данные из JSON, и есть некоторые данные о деньгах, как показано ниже:
$234,205,860
Я думал сопоставить эти данные с моим классом DTO как String, но я не уверен, что в Java есть правильный тип данных. Я смотрю в Интернете, но не мог найти для такого рода данных.
Итак, есть ли какой-либо тип данных для этой денежной ценности? Или я должен использовать String для хранения таких данных в Java?
BigDecimal
было бы лучше, но я не уверен, должен ли я анализировать эти значения валюты и удалять части «$». Такой подход подходит? Или мы должны сохранить и эти значения (на случай, если несколько валют хранятся в одной таблице)?
Я уверен, что у нас нет другого способа оценить требования или данные вашего проекта, кроме как через вас. Вот почему я сформулировал свой предыдущий комментарий именно так, а не дал конкретную рекомендацию. Сохранение значений в виде строк допустимо, если вы будете обрабатывать их как непрозрачные строки. Но если вы собираетесь выполнять с ними арифметические или другие числовые операции, я рекомендую преобразовать их в числовую форму. И если вам нужно отслеживать валюту, сделайте это — это не требует сохранения всего в строковой форме.
Ключевым словом здесь является точность. Double* и float в большинстве случаев — плохой выбор! Чтобы не потерять точность, можно было бы вспомнить String, который прекрасно работал бы для хранения значений, не сталкиваясь с проблемами, разрушающими точность. Длинный также может быть хорошим в некоторых случаях.
Если вам нужно манипулировать значениями в будущем, используйте BigDecimal. Какой тип данных использовать для денег в Java?
Обновлено: * должно быть двойным (не длинным).
long
хорошо, если вы понимаете диапазон и точность значений, которые вы храните, и решаете, хранить ли центы или доллары. float
и double
— плохой выбор.
А как же знак $??? Должен ли я разделить и удалить его?
спасибо tgdavies, я имел в виду, что из-за проблем с точностью следует избегать двойных и плавающих чисел. @Rosa да, конечно, вы бы проанализировали и удалили знак валюты из самого значения и сохранили его рядом, например. легкая конвертация валюты в будущем.
Предполагая, что вы хотите работать с несколькими валютами, вы должны создать класс, который содержит как стоимость валюты, так и единицы (доллары, фунты, риалы и т. д.).
Для значения вы можете использовать масштабированный long
(т.е. хранить центы или любую другую наименьшую единицу) и масштабировать числа для ввода/вывода. Это работает, только если вы уверены, что стоимость центов (или наименьших единиц) всегда меньше 263-1 или 9 223 372 036 854 775 807, включая любые промежуточные результаты вычислений. Если вы не хотите беспокоиться о потенциальном переполнении, BigDecimal
— это то, что вам нужно.
Для юнитов есть класс java.util.Currency
, но он может соответствовать или не соответствовать вашим потребностям.
Почему НИКОГДА не использовать плавающую точку для валюты:
большое спасибо, проголосовал. Я буду использовать BigDecimal
.
Я бы обычно представлял суммы денег с помощью числового типа данных с фиксированной точкой. Детали в некоторой степени зависят от диапазона и точности, которые вы хотите представить, а также от операций, которые необходимо поддерживать, но одна из
long
,int
илиBigDecimal
будет более обычным выбором, чемString
.