我一直在寻找类似于我现在遇到的问题的几个小时,但是我找不到任何东西,也没有找到任何东西,也没有找到其他网站.
#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内的某个位置以暂时停止循环)所有步骤都是正确的,可能是一个愚蠢的错误或我看不到的东西,但是现在我不知道我知道在哪里敲我的脑袋了.
感谢阅读这篇很长的帖子,感谢任何帮助,对不起我的英语不好!
运行此代码段
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)
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |