Явное преобразование типов Java дает разные результаты
Я хотел бы знать, в каком порядке работает явное преобразование типов и в какой области это работает. В следующем примере я получаю разные результаты.
float S = 0;
for (int i = 1; i <= 10; i++)
for (int j = 3; j <= 20; j++)
S += (i * j - 5.)/(2. * i + j / 3);
результат 621,8933
float S = 0;
for (float i = 1; i <= 10; i++)
for (float j = 3; j <= 20; j++)
S += (i * j - 5)/(2. * i + j / 3);
S = 607,3105
float S = 0;
for (int i = 1; i <= 10; i++)
for (int j = 3; j <= 20; j++)
S += (float)(i * j - 5)/(2 * i + j / 3);
S = 621,8933
float S = 0;
for (int i = 1; i <= 10; i++)
for (int j = 3; j <= 20; j++)
S += (i * j - 5)/(2 * i + j / 3.);
S = 607,3105
Очевидно, правильный результат - 607,3105. Почему он не продвигается, когда я пишу (плаваю) или умножаю на 2., но работает, когда я делю на 3.? Заранее спасибо.
0 ответов
Код 1 S += (i * j - 5.)/(2. * i + j / 3);
:
j
являетсяint
Таким образом, полный делительint
и неявное приведение к int выполняется
Код 2 S += (i * j - 5)/(2. * i + j / 3);
j
,x
поплавки и все последовательные результаты тоже поплавки
Код 3 S += (float)(i * j - 5)/(2 * i + j / 3);
j
являетсяint
Таким образом, полный делительint
и неявное приведение к int выполняется- Явный
float
- выполняется после вычисления делителя
Код 4 S += (i * j - 5)/(2 * i + j / 3.);
- Из-за "3" делитель становится типа "двойной"
Обратите внимание, что 3.
это двойник, 3.f
это поплавок. Это приводит к использованию различной точности в операции.