需要一些解释来真正理解循环/二进制如何在这个特定的例子中工作(JAVA)

时间:2017-05-01 17:47:22

标签: java binary

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是不是有意义,不应该创建一个无限循环?

2 个答案:

答案 0 :(得分:1)

  1. 我不会消失。如果添加System.out.println(i);在for循环之后,你会看到我是21岁。

  2. 双倍只能有15个小数位。此原语不会存储小于0.000000000000001的所有内容。在设定0.1 20次后,它将为零。因此,如果控制台显示“1.0”,请不要感到惊讶。您添加了0到1。

  3. 为什么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,之后将该值赋给左边的变量。