C++ Do-While无限循环,即使条件满足(无法理解为什么)

-2 c++ infinite-loop do-while

我一直在寻找类似于我现在遇到的问题的几个小时,但是我找不到任何东西,也没有找到任何东西,也没有找到其他网站.

#include <iostream>
using namespace std;

int main()
{
    double Numero=0, ParteDecimale=0, Controllo=0, Controllo2=0;
    int ParteIntera=0;
    string Var1="1", Var0="0", NumeroFinale;
    cout<<"\n\n\tBenvenuto, questo programma ti consente di convertire la parte\n"
          "\tdecimale di un numero in sistema binario. Per iniziare, inserisci un numero: ";
    cin>>Numero;
    cout<<Numero<<" Numero\n\n"<<endl; //
    ParteIntera=Numero; //casting implicito, in modo da poter isolare esclusivamente la parte decimale del numero inserito.
    cout<<ParteIntera<<" ParteIntera\n\n"<<endl; //
    ParteDecimale=Numero-ParteIntera; //Isolamento della parte decimale
    cout<<ParteDecimale<<" ParteDecimale\n\n"<<endl; //
    Controllo2=ParteDecimale;

do{
    ParteDecimale=ParteDecimale*2; //Moltiplicazione della parte decimale per due
    cout<<"\n\nParteDecimaleCiclo "<<ParteDecimale<<endl; //



    if(ParteDecimale<1){
        NumeroFinale=NumeroFinale+Var0;
        cout<<"\n\nNumeroFinaleMin1 "<<NumeroFinale<<endl; //
    }
    else{
        NumeroFinale=NumeroFinale+Var1;
        cout<<NumeroFinale<<" NumeroFinaleMagg1\n\n"<<endl; //
        ParteDecimale-=1;
        cout<<ParteDecimale<<" ParteDecimaleMagg1\n\n"<<endl;
    }
    Controllo=ParteDecimale;
    cout<< "\n\nCONTROLLO " <<Controllo; //
    cout<<"\n\nNUMERO "<<Numero; //
  }
  while(Controllo!=Controllo2);

cout<<NumeroFinale<<endl; 
}
Run Code Online (Sandbox Code Playgroud)

很抱歉,如果代码很乱,但当我看到它没有按预期工作时,我决定输出每个值以跟随进程,这是奇怪的事情..代码完全按预期行事,结果没问题,它只是拒绝退出do-while循环,即使满足条件.

例如:

-I输入"12.2",程序将数字存储在"ParteIntera"变量中(这是一个int,我这样做是为了删除小数部分);

- 在"ParteDecimale"中存储"Numero-ParteIntera"(Numero是我在开头输入的输入),此时"ParteDecimale"等于0.2;

- "ParteDecimale"的值存储在"Controllo2"中;

- 这里开始Do-While循环,基本上是"ParteDecimale*2",所以它是"0.4";

- 检查ParteDecimale是大于还是小于1,并在此基础上执行if语句中的istructions;

- 从if语句获得的"ParteDecimale"的值然后存储在"Controllo"中(在这种情况下它是0.4);

- 检查条件,在这种情况下,"Controllo"和"Controllo2"仍然不同,所以循环重新开始;

在某个时刻ParteDecimale将为0.6,所以当循环开始时ParteDecimale变为1.2(0.6*2).由于它大于1,因此执行else语句并且ParteDecimale变为0.2(1.2-1).此时"Controllo"和"Controllo2"都是0.2,因此do-while内的条件不再满足,循环应该结束.

我无法理解为什么,它没有结束.如果您运行代码,您将看到(您必须快速单击cmd内的某个位置以暂时停止循环)所有步骤都是正确的,可能是一个愚蠢的错误或我看不到的东西,但是现在我不知道我知道在哪里敲我的脑袋了.

感谢阅读这篇很长的帖子,感谢任何帮助,对不起我的英语不好!

Cer*_*ros 5

运行此代码段

float value = 2 * 0.3;

if (value == 0.6)
  std::cout << "Exactly" << std::endl;
else
  std::cout << "Ooops" << std::endl;
Run Code Online (Sandbox Code Playgroud)

你会看到输出是这样的

0.600000024
Run Code Online (Sandbox Code Playgroud)

尝试使用epsilon-delta逻辑而不是精确值

if (value >= 0.6 && value <= 0.6001)
Run Code Online (Sandbox Code Playgroud)