public class fpNumbers {
public static void main(String args[]) {
int i;
double d = 0.1;
for(i = 1; i <= 20; i++) {
System.out.println(1.0 + d);
d = d / 10;
}
}
}
对于上面的代码,问题是为什么在几次迭代后结果变为1,0。
但在此之前我想知道究竟发生了什么。我理解for循环是如何工作的(至少我是这么认为的),但i++
意味着每回合都会将{+1}添加到i
。但是为什么i
在此之后会消失,System.out.println(1.0 + d);
然后......的原因是什么...... 1.0与i
权利无关,d
是还d = d / 10
?对我来说,变量本身如何除以10是不是有意义,不应该创建一个无限循环?
答案 0 :(得分:1)
我不会消失。如果添加System.out.println(i);在for循环之后,你会看到我是21岁。
双倍只能有15个小数位。此原语不会存储小于0.000000000000001的所有内容。在设定0.1 20次后,它将为零。因此,如果控制台显示“1.0”,请不要感到惊讶。您添加了0到1。
为什么d = d / 10会导致无限循环?该值将被精确地除以10。如果我有一个带有苹果的碗,并将苹果切成10块,我也不会收到无数块。
答案 1 :(得分:0)
在几次迭代后结果变为1.0的问题是double有15位有效数字,这限制了它的精度。
经过几次迭代后,你得到一个数字1.0000000000000001,它需要16位有效数字,而double不能代表它,所以它“削减”它。
例如,如果您将println()
行更改为以下内容,
System.out.println(d);
您会看到正确的结果,因为这些数字只需要1位有效数字。
要了解有关双位和有效数字的更多信息,我建议
其次d = d / 10
不会导致无限循环。
赋值操作的工作原理如下:首先,计算右表达式,在你的情况下计算d / 10,之后将该值赋给左边的变量。