Счет денег в java

298
22 июля 2017, 05:48

Такая ситуация, пишу приложение в котором пользователь указывает необходимое кол-во товара после чего видит итоговую сумму(ценаТовара*КолВо). Проблема в следующем, т.к. в java вот это выражение:

double a = 2.0 - 1.1;

равно не 0.9 , а вот чему 0.89999999999999991 , то возник такой вопрос, как мне считать общую сумму товара, чтобы избежать подобных неточностей? Цена за единицу товара у меня представлена типом float, с ним такие же проблемы? Думал округлять итоговую сумму до двух знаков, но тут тоже кажется могут быть проблемы, и наличие погрешности в расчетах зависит прямо пропорционально от кол-ва умножаемого на цену товара, чем больше тем больше погрешность.

Answer 1

Зачем такие сложности, начинайте всегда с простого. Тем более вы находитесь на этапе разработки. Храните суммы в типе int, а потом просто поделите на 100 для получения копеек. Например, стоимость = 52025 руб, что означает 520 руб 25 коп.

Преимущества:

  • int удобно хранить значения в БД
  • не нужно писать кучу кода для вычислений
  • нет проблем с кучей знаков после запятой
Answer 2

Не все десятичные дроби можно точно представить в виде double или float. Это связано с особенностью хранения данных в формате с плавающей точкой.

При работе с финансами можно использовать класс BigDecimal, который обеспечит необходимую точность.

В Вашем случае:

BigDecimal value = new BigDecimal("2.0").subtract(new BigDecimal("1.1"));
READ ALSO
Запуск скрипта на питоне из java кода

Запуск скрипта на питоне из java кода

У меня есть скрипт на питоне который генерит текстовые файлы с данными '(with open('/data_min_out

284
HashMap<String, List<String[]>> извлечь List<String[]>

HashMap<String, List<String[]>> извлечь List<String[]>

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

231
Помогите найти список api методов в openfire? [требует правки]

Помогите найти список api методов в openfire? [требует правки]

Где найти список api методов для openfire? Если у вас есть ссылка дайте пожалуйста ссылку

222
Как удалить беседу (delete conversation) через Telegram API BOT

Как удалить беседу (delete conversation) через Telegram API BOT

В приложение Telegram есть кнопка Delete conversationВ TELEGRAM API есть возможность удалить беседу?

303