1

我想知道显式类型转换的工作顺序以及它在哪个区域工作。在下一个示例中,我收到不同的结果。

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 时它起作用?提前致谢。

4

1 回答 1

0

代码 1 S += (i * j - 5.)/(2. * i + j / 3);

  • jint,因此完全除数是int并且执行到 int 的隐式强制转换

代码 2S += (i * j - 5)/(2. * i + j / 3);

  • j,x是浮点数,所有连续的结果也是浮点数

代码 3S += (float)(i * j - 5)/(2 * i + j / 3);

  • jint,因此完全除数是int并且执行到 int 的隐式强制转换
  • 显式float- 在计算除数之后执行

代码 4S += (i * j - 5)/(2 * i + j / 3.);

  • 由于'3' 除数变为“双”类型

注意3.是double,3.f是float。这导致在操作中使用不同的精度。

于 2019-04-28T11:36:09.740 回答