如果用户输入不等于 0 的数字“n”(整数),我的程序应检查分数 1/n
的小数点后是无限位数还是有限位数。例如:对于 n=2
,我们有 1/2=0.5
,因此小数点后有 1 位。我对这个问题的第一个解决方案是:
int n=1;
cin>>n;
if((1.0/n)*n==1)
{
cout<<"fixed number of digits after decimal point";
}
else cout<<"infinite number of digits after decimal point";
由于计算机无法存储无限数字,如 1/3
,我预计 (1/3)*3
不会等于 1
。我第一次运行该程序时,结果是我预期的结果,但是当我今天运行该程序时,对于 n=3
我得到了输出 (1/3)*3=1
。我对这个结果感到惊讶并尝试了
double fraction = 1.0/n;
cout<< fraction*n;
这也返回 1. 为什么行为不同,我可以让我的算法工作吗?如果我不能让它工作,我将不得不检查 n
的除数是否只有 1、2 和 5,我认为这会更难编程和计算。
我的 IDE 是 Visual Studio,因此我的 C++ 编译器是 VC。
最佳答案
您的代码试图利用 1.0/n
没有以完美的精度完成这一事实,这是事实。将结果乘以 n
理论上应该得到不等于 1 的结果,正确。
遗憾的是,您的代码中与 n
的乘法也没有以完美的精度完成。
使您的概念出错的事实是,这两个不完美可以相互抵消,最终您会得到一个看似完美的 1。
所以,是的。使用除数检查。
关于c++ - 检查 1/n 小数点后是否有无限位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64607684/