Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最小意外原则 double d=0.0; 对于(int i=0;i_Java - Fatal编程技术网

Java 最小意外原则 double d=0.0; 对于(int i=0;i

Java 最小意外原则 double d=0.0; 对于(int i=0;i,java,Java,这是我在某处读到的一个关于“最小惊喜原则”的例子 我只是好奇为什么代码会返回一个0.99999999,如果我将d的数据类型更改为float,我会得到一个1.0000001。这种行为背后的原因是什么。这是浮点数不精确的典型案例。由于0.1不能用二进制(它是一个重复的数字)清晰地表示,因此当数字一次又一次地添加到自身时,会出现舍入错误。当我们更改为浮点时,行为上的差异归结为在存储更多位的过程中实际保持0.1的方式上的差异 如果您需要十进制数的精确表示,BigDecimal类将很快成为您最好的朋友。基

这是我在某处读到的一个关于“最小惊喜原则”的例子


我只是好奇为什么代码会返回一个0.99999999,如果我将d的数据类型更改为float,我会得到一个1.0000001。这种行为背后的原因是什么。

这是浮点数不精确的典型案例。由于0.1不能用二进制(它是一个重复的数字)清晰地表示,因此当数字一次又一次地添加到自身时,会出现舍入错误。当我们更改为浮点时,行为上的差异归结为在存储更多位的过程中实际保持0.1的方式上的差异


如果您需要十进制数的精确表示,BigDecimal类将很快成为您最好的朋友。基于它如何在不损失精度的情况下在内部存储小数点的详细信息,计算将保持其完整性。

完全不相关,但会燃烧
d=d+0.1
。这有一个操作员。不同机器上的结果相同吗?不管怎么说,它很有趣。一颗老栗子。人们在Atari 800上键入“?2+2[Enter]”时嚎叫,得到3.99999。是的,它在基本解释器中进行了自己的浮点运算。当我在黑板上写“I=I+1”时,孩子们也会斜视着我。“我怎么能等于我+1?!”他们喊道。太令人惊讶了。太不直观了——这就是编程!我要补充的是,退房(和相关链接)会很有帮助。
double d = 0.0;
    for (int i = 0; i < 10; i++)
    {
        d = d+0.1;
    }
    System.out.println(d);