java显式类型转换给出了不同的结果

时间:2014-06-09 11:35:38

标签: java type-conversion explicit promotions

我想知道明确的类型转换工作在哪个订单,在哪个区域工作。在下一个例子中,我收到了不同的结果。

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

1 个答案:

答案 0 :(得分:0)

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

  • jint,因此完整除数是int,并执行对int的隐式转换

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

  • jx都是浮点数,所有连续结果也是浮点数

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

  • jint,因此完整除数是int,并执行对int的隐式转换
  • 显式float-是在计算除数之后执行的

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

  • 由于“ 3”。除数变为“ double”类型

请注意,3.是双精度型,3.f是浮点型。这样会导致操作中使用不同的精度。