如果我将f从int更改为double,以下代码的输出如何变化?

时间:2017-04-06 15:33:29

标签: java

int f=1;  //this is to store factorial value
double s=1;
for(int i=1;i<=10;i++){
   f=f*i;    //Even though i is int,changing f from int value to double value brigs a difference
   s=s+(double)(1/f);
}
System.out.println(s);

我必须找到一个数字的阶乘。我发现在上面的代码中,如果我将f从int更改为double,我的答案是十进制值,但如果我使用int,我的答案不会是小数。 就像int的情况一样 - 在double的情况下是2.0 - 2.718281,f只是乘以int值,小数值从哪里来?

5 个答案:

答案 0 :(得分:0)

那是因为 f double ,其操作的结果是 s (s = s + 1 / f;)将返回 double 值,如果是 int 它将返回 int 值(截断)。

看看这个docs

答案 1 :(得分:0)

因为除了第一种情况外1/f始终为0。

将另一个system.out放在你的内部:

        int f=1;  //this is to store factorial value
    double s=1;
    for(int i=1;i<=10;i++){
        f=f*i;    //Even though i is int,changing f from int value to double value brigs a difference
        System.out.println(1/f);

        s=s+(double)(1/f);
    }
    System.out.println(s);

如果您在double值中更改f,则所有1/f都应返回实际的double值而不截断它。

答案 2 :(得分:0)

问题在于这个表达: -

s=s+(double)(1/f);

此处,当fdouble时,1/f会返回一个double值。如果fint,则值1/f也是int例如: -

1/2.0 -> gives 0.5
1/2   -> gives 0

答案 3 :(得分:0)

在java中,如果分子和分母中至少有一个是double,则结果为double。在这种情况下,分子(1)是一个int,因此如果f是一个int,则1 / f将是一个int,如果f是double,则1 / f将是double。

如果f是int:

用于迭代1,即i = 1

s=s+double(1/f) will be s=1.0+double(1/1) -> s=1.0+double(1) -> s=1+1.0 -> s->2.0

对于迭代2,即i = 2,现在s = 2.0

s=s+double(1/f) will be s=2.0+double(1/2)

1/2 = 0因为int除以int将是一个int

s=2.0+double(0)

现在整数0被强制转换为double。所以它变成

s=2.0+0.0 -> s=2.0

同样,对于所有剩余的迭代都会发生这种情况。当f是大于1的int

时,1 / f总是为零

如果f是双重

用于迭代1,即i = 1

s=s+double(1/f) will be s=1.0+double(1/1.0) -> s=1.0+double(1.0) -> s=1.0+1.0 -> s->2.0

这里不需要类型转换为double,因为java中的int / double已经导致双重

对于迭代2,即i = 1,现在s = 2.0

s=s+double(1/f) will be s=2.0+double(1/2.0)

1/2 = 0.5因为int除以double将是double并且十进制不会丢失

-> s=2.0+double(0.5) -> s=2.5

再次强制转换为双倍是不必要的。

类似地,当您使用double时,所有其他迭代中的小数部分不会丢失。

因此,当f为float且f为int

时,您会看到差异

答案 4 :(得分:0)

在int (1 / f)的情况下,只返回商部分,但在double的情况下,它将返回一个十进制值。例如,如果 f 的值为2。

在int(1/2)的情况下,将给出0。

在double(1 / 2.0)的情况下会给0.5。