Установка точности для двойной в Java

1
 DecimalFormat df = new DecimalFormat("#.000000");
 int a[] = { 2, 2, 3, 3, 4, 4 };
 double sum = 0.000000;
 for (int i = 0; i < a.length; i++)
 {
    sum = sum + (double) a[i];
 } 
 output1=Double.valueOf(df.format(sum / a.length));

где значение sum/a.length равно 3. output1 является двойной переменной. Теперь результат, который я хотел, это 3.000000, и он должен быть сохранен в double variable output1 но я не могу его получить.

Теги:

4 ответа

2

Хотя в некоторых случаях это может работать, как правило, невозможно определить/заставить десятичную точность double значения или даже любого числа с плавающей запятой IEEE.

Если вы хотите десятичную точность в Java, используйте BigDecimal. Это еще более важно, если цифры, с которыми вы работаете, представляют деньги.

Если приблизительный результат достаточно хорош (и есть много расчетов там, где он есть), вы можете использовать double но имейте в виду, что он не всегда может быть двоичным числом с плавающей запятой и точным округлением до десятичных знаков.

1

Примитивный тип double является аппроксимацией действительного числа с последовательностью (отрицательных) степеней 2.

Следовательно, десятичная нотация 0.2 = 0 * 2 -1 +... + 1 * 2 -4 +... с ошибкой, поскольку в базе 2 потребуется бесконечная последовательность.

Если вам нужна точность со значением, нужно BigDecimal:

BigDecimal oneFifth = new BigDecimal("0.200"); // Precision/scale 3
BigDecimal hundredPlusOnefifth =
      oneFifth.multiply(BigDecimal.valueOf(501)); // 100.200

Используя String в конструкторе, BigDecimal может установить точность.

Не очень приятно писать выражения в BigDecimal.

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

0

Похоже, что sum - это int и у вас есть результат целочисленного деления (потому что a.length - int). Просто умножьте одно из этих значений на 1.0:

output1 = Double.valueOf(df.format((sum * 1.0) / a.length));

С измененным кодом ваша проблема заключается не в получении значения output1 а в том, как вы его показываете. Не печатайте output1 напрямую, вместо этого используйте DecimalFormat вы использовали ранее:

System.out.println(df.format(output1));
  • 1
    Я думаю, что приведение к удвоению было бы более очевидным
  • 0
    Нет, результат снова 3.0
Показать ещё 2 комментария
0

Значение в 3.0 и 3.00000 одинаково в двойной переменной. Когда вы печатаете его, отформатируйте его так, как вы хотите:

 System.out.println( df.format( output1 ) );
  • 1
    Это не C #, в Java нет метода Console#WriteLine .
  • 0
    Это помечено как Java ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню