问题
在计算机编程中有时会遇到一些需要做分支判断的情况,例如:
if(0.1 + 0.2 == 0.3){
cout << "yes" << endl;
}else{
cout << "no" << endl;
}
但是最后发现走的分支一直都是else的分支,为什么会出现上述的原因呢?
这是因为在计算机中使用的是二进制的浮点数,通常使用IEEE 754标准进行表示,这就导致一些特殊的值不能准确的表示出来(0.1、0.2、0.3)。
背后的原理
在十进制系统中,如果一个分数使用基数(10)的质因数来表示,那么它可以被精确地表示。
10 的质因数是 2 和 5。
因此,1/2、1/4、1/5 (0.2)、1/8 和 1/10 (0.1) 可以被精确地表示,因为分母使用了 10 的质因数。
而 1/3、1/6 和 1/7 是无限循环的小数,因为分母使用了 3 或 7 的质因数。
在二进制(计算机使用的系统)中,如果一个分数使用基数(2)的质因数来表示,那么它可以被精确地表示。
2 是 2 的唯一质因数。
因此,1/2、1/4 和 1/8 都可以被精确地表示,因为分母使用了 2 的质因数。
而 1/5 (0.2) 或 1/10 (0.1) 是无限循环的小数,因为分母使用了 5 或 10 的质因数。
所以当我们尝试表示像 0.1 这样的十进制小数时,计算机会使用一个近似值。这个近似值是通过将无限循环的二进制小数转换为有限位数的浮点数表示来实现的。
因此,当我们在计算机中进行浮点数运算时,结果可能会有微小的误差。
解决方法
1.先将小数转换为整数来进行计算,计算完成后再转换成浮点数
if(0.1*10 + 0.2*10 == 0.3*10){
cout << "yes" << endl;
}else{
cout << "no" << endl;
}
2.计算两者的差值是否小于某一个误差范围
if(abs(0.1 + 0.2 - 0.3) < 1e-6){
cout << "yes" << endl;
}else{
cout << "no" << endl;
}
3.使用各类语言中的一些特殊函数。
标签:10,0.1,0.3,0.2,质因数,小数 From: https://www.cnblogs.com/aloneqing/p/18405279