在C#里面,如果一个整数除以0,会报错;可是如果一个浮点数除以0,那么结果就是无穷大(如果是负的浮点数数除以0就是负无穷)。
这个时候,你用Sn + 1 / n,会先计算(1 / n),然后把结果转成double,1/0在C#中是会报错的;
而如果是Sn + 1.0 / n。那么会先把n转成double,然后去和1.0做除法。也就是哪怕你的n是零,1.0/0是不会报错的。
至于为什么n应该是从1开始,却报了除零错误。是因为,加的次数太多了,他越界了。
至于为什么会越界,上面说了,Sn+n/1是先计算n/1再将结果转换成double类型,而因为这个除了第一次循环,在n=1的时候,1/n的结果是1,其他时候这个运算的结果一直是零。
而你的Sn,也只有第一次循环的时候,从0+1/1变成了1之外,也一直在+0(或者-0),他的结果就一直不变,这就导致你的n会一直加下去。超过Int.MaxValue之后,就会变成Int.MinValue,这个值是负数,然后会接着一直加到,变成0。
也就是说你看到的零不是初始值,是他循环了一圈以后回来的。
所以,当你的使用的是Sn+=1/n的时候,只要k的值不是0或负数,就肯定会报错,因为Sn最大就到1,所以只要k比0大,哪怕是1,也会导致Sn<=k的条件一直成立,循环一直无法结束,使得n会一直加下去,直到越界,变成负数,再一直加到0。
这个时候,你用Sn + 1 / n,会先计算(1 / n),然后把结果转成double,1/0在C#中是会报错的;
而如果是Sn + 1.0 / n。那么会先把n转成double,然后去和1.0做除法。也就是哪怕你的n是零,1.0/0是不会报错的。
至于为什么n应该是从1开始,却报了除零错误。是因为,加的次数太多了,他越界了。
至于为什么会越界,上面说了,Sn+n/1是先计算n/1再将结果转换成double类型,而因为这个除了第一次循环,在n=1的时候,1/n的结果是1,其他时候这个运算的结果一直是零。
而你的Sn,也只有第一次循环的时候,从0+1/1变成了1之外,也一直在+0(或者-0),他的结果就一直不变,这就导致你的n会一直加下去。超过Int.MaxValue之后,就会变成Int.MinValue,这个值是负数,然后会接着一直加到,变成0。
也就是说你看到的零不是初始值,是他循环了一圈以后回来的。
所以,当你的使用的是Sn+=1/n的时候,只要k的值不是0或负数,就肯定会报错,因为Sn最大就到1,所以只要k比0大,哪怕是1,也会导致Sn<=k的条件一直成立,循环一直无法结束,使得n会一直加下去,直到越界,变成负数,再一直加到0。