为什么加上小数浮动是错误的?

Dom*_*iik 3 floating-point equality

可能重复:
添加Double值不一致

int x = 0;
float n = 0;
while ( n != 1 ) {
n += 0.1;
++x;
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么这个循环是无限的?

Oli*_*rth 16

0.1 无法在浮点中精确表示:

printf("%.16f\n", 0.1f);
Run Code Online (Sandbox Code Playgroud)

显示:

0.1000000014901161
Run Code Online (Sandbox Code Playgroud)

所以n永远不会完全等于1.

正如@sirlak在下面的评论中所说的那样,测试浮点变量是否相同,这几乎是不正确的.

  • 使用浮点数测试> =或<=.从来没有测试严格的平等,正是因为这个问题.如果你需要测试相等性,测试一个范围,例如`(n> 0.99)&&(i <1.01)` (3认同)
  • @sirlark:"从不测试严格的平等"并不总是有效的建议,但它通常是*的情况. (3认同)