Явное преобразование типов 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 это поплавок. Это приводит к использованию различной точности в операции.

Другие вопросы по тегам