Большой тип данных в Java - PullRequest
0 голосов
/ 26 декабря 2018

Я работал над приложением.Это связано с торговым бизнесом.Есть модель, которая имеет:

 private Float count;
 private Long price;

Я хочу знать лучший тип данных Java для count * price из-за огромного количества price и count.

Другая рукапереполнение не происходит при работе price * count.

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

JSR 354: API денег и валюты

В качестве решения вы можете рассмотреть подход с библиотекой JavaMoney.org на GitHub .Эта библиотека реализует спецификацию JSR 354: деньги и валюта .

Цели этого API:

  1. Предоставление APIдля обработки и расчета денежных сумм
  2. Для определения классов, представляющих валюты и денежные суммы, а также для округления денежных единиц
  3. Для работы с курсами валют
  4. Для работы с форматированием и синтаксическим анализомвалют и денежных сумм

Если вы не хотите использовать какую-либо библиотеку, конечно, вы должны использовать BigDecimal.

0 голосов
/ 26 декабря 2018

Максимальное значение:

  • Float равно Float.MAX_VALUE, (2-2 ^ 23) * 2 ^ 127, что-тонапример, 3.40282346638528860e + 38 или 340 282 346 638 528 860 000 000 000 000 000 000 000,000000.
  • Long равно Long.MAX_VALUE, 2 ^ 63-1 или 9 223 372 036 854 776 000.

Как раз такого родаВы занимаетесь торговым бизнесом, который не подходит для этих типов?

С плавающей точкой

На самом деле, вы не хотите Float по той простой причине, что он основан на плавающем, и вы никогда не будете использовать деньги с плавающей точкой.Никогда не используйте плавающую точку для контекста, где важна точность.Плавающая точка меняет точность на скорость исполнения.Обычно ваши клиенты будут заботиться о деньгах.Таким образом, вы никогда не будете использовать типы float, Float, double или Double в Java для таких целей.Этот обходной путь, очевидно, подвержен путанице и ошибкам, поэтому требует тщательного документирования и кодирования.

BigDecimal

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

Рекомендации по использованию BigDecimal применимы только в том случае, если у вас есть небольшая сумма, например, отслеживание копеек на долларе.Если вы используете только целые числа, вам не нужно вводить BigDecimal.

Целочисленный обходной путь для дробных сумм

Действительно, обходной путь для проблемы с плавающей запятой в языках, не имеющих альтернативы, такой как BigDecimal, заключается в умножении всех дробных сумм до тех пор, пока они не станут целыми числами.Например, если вы ведете бухгалтерию до копейки на доллар (США), то умножьте все суммы на 100, чтобы количество целых копеек было целым числом, а не дробными долларами.

Целые числа

Что касается работы с целыми числами в Java, у вас есть несколько простых вариантов выбора .

  • Для чисел 127 и менее используйте byte или Byte, используя 8 бит .
  • Для чисел 32 767 и менее используйте short или Short, используя 16 бит .
  • Для чисел 2 ^ 31-1 и менее (около 2 миллиардов) используйте int или Integer, используя 32 бита .
  • Для чисел 2 ^ 63-1 именьше (около десятка миллиардов), используйте long или Long, используя 64 бита .
  • Для еще больших чисел используйте BigInteger.

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

32-разрядные или 64-разрядные типы являются основными вариантами современного оборудования.Вам не нужно беспокоиться о наименьших типах, если вы не работаете с огромным количеством этих значений или сильно ограничены в памяти.И использование BigInteger является излишним для большинства бизнес-ориентированных приложений.(Приложения для науки и техники могут быть другой историей.)


См. Также Ответ i.merkurev в JSR 354: Деньги и валюта API библиотека.

0 голосов
/ 26 декабря 2018

Для больших значений существуют классы BigDecimal или BigInteger.Я буду использовать BigDecimal в вашем случае.Вы никогда не переполняетесь этими классами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...