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);