为什么此段代码不会再任何一个break
停下呢?
#include <iostream>
using namespace std;
int main()
{
for (double i = 0; i!= 10; i += 0.1)
{
if (i == 10)
{
cout<<"10"<<endl;
break;
}
if (i == 10.0)
{
cout<<"10.0"<<endl;
break;
}
cout<<i<<endl;
}
return 0;
}
首先,两个 if 是一样的。浮点数和整数比较时,整数被转为浮点数。
然后,i 为什么不等于 10.0?因为它只会等于这些值:
你可以看到,浮点数十进制转二进制有误差。100 次误差积累之后,i 只会等于 9.99999999999998。(我使用的是 Python 3.6,浮点数的十进制表示会采用等价表示法中最短的。它也是采用与 C 语言相同的内部表示。)
浮点数在计算机中是以二进制形式表示和运算的(通常使用 IEEE 754 标准),而 0.1 不能精确地用二进制来表示(是循环小数;只有分母只包含因子 2 的小数,使用二进制表示时才不会循环)。这样一来就会有误差。误差积累之下,它会就偏离十进制越来越远。
如果你需要比较相等性,可以与指定的数求差,如果差值小于特定值(比如 Python 里有
math.isclose
函数),就认为相等。如果你需要精确值(比如做金融计算,一分钱也不能少的那种),你可以使用所谓的「十进制数」来运算(decimal,Python 和 Ruby 都支持的。也可以使用 mpdecimal 库),或者指定精度(比如使用 mpfr 库),或者使用定点数。