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
值,小数值从哪里来?
答案 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);
此处,当f
为double
时,1/f
会返回一个double值。如果f
是int
,则值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。