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
но я не могу его получить.
Хотя в некоторых случаях это может работать, как правило, невозможно определить/заставить десятичную точность double
значения или даже любого числа с плавающей запятой IEEE.
Если вы хотите десятичную точность в Java, используйте BigDecimal
. Это еще более важно, если цифры, с которыми вы работаете, представляют деньги.
Если приблизительный результат достаточно хорош (и есть много расчетов там, где он есть), вы можете использовать double
но имейте в виду, что он не всегда может быть двоичным числом с плавающей запятой и точным округлением до десятичных знаков.
Примитивный тип 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.
С двойным можно было бы жить, осторожно округляя в соответствующих точках кода. Всегда будет небольшая ошибка, и при выводе требуется форматтер, поскольку количество цифр будет потеряно.
Похоже, что 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));
Значение в 3.0
и 3.00000
одинаково в двойной переменной. Когда вы печатаете его, отформатируйте его так, как вы хотите:
System.out.println( df.format( output1 ) );
Console#WriteLine
.