Обработка чисел с большим количеством значений после запятой в Java

#java #decimal

#java #десятичная

Вопрос:

Я делаю

  Collections.frequency(List<String>, List<String>.get(i)) / List<String>.size()
  

Результат для приведенного выше вычисления должен быть (например)

 0.00631
0.0002378
0.00571
  

но вместо этого я получаю 0.0 .
Как мне справиться с этим? Я продолжаю получать 0.0 с double и float

Спасибо

Комментарии:

1. Вам придется быть более конкретным. Возможно, показать какой-нибудь код?

2. Откуда ты берешь 0.0? Отладчик, консоль, файл?

3. Особенно учитывая, что это не так уж много значений после запятой, если смотреть на это в научной нотации: 6.31e-3, 2.378e-4, 5.71e-3 . Как есть, эти значения не должны вызывать проблем, поэтому нам понадобится дополнительная информация.

4. Вы используете целые числа для выполнения деления проверьте ответ aioobe

Ответ №1:

Если значения 0.00631 , 0.0002378 и 0.00571 являются ожидаемыми результатами от делений, убедитесь, что вы не выполняете целочисленные деления. То есть, убедитесь, что числитель или знаменатель приведены к значению с плавающей запятой или double.

Вместо

 double fraction = someInt / someOtherInt;
  

вы можете сделать

 double fraction = (double) someInt / someOtherInt;
  

В вашем конкретном случае вы могли бы попробовать что-то вроде

 (double) Collections.frequency(list, list.get(i)) / list.size();
  

Ответ №2:

Используйте BigDecimal это без какого-либо округления для очень больших или очень маленьких чисел за счет большего потребления памяти и более медленных вычислений. Этот класс необходим для любых финансовых данных.

 BigDecimal val = new BigDecimal("10000000000000.0002378");
System.out.println(val);
  

Комментарии:

1. OP предоставил немного больше информации, и BigDecimal кажется ненужным для того, что он делает.