c++ - 检查 1/n 小数点后是否有无限位数

标签 c++ math arithmetic-expressions

如果用户输入不等于 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/

相关文章:

c# - C# 中有指数运算符吗?

c++ - 为什么我的程序不能正常工作

c++ - 计算字符串中相同的数字并将它们打印为星星 C++

mysql 算术函数中的单引号

javascript - JavaScript 锯齿状多维数组中的逐元素算术运算

math - ‘1 * BigInt(1)’ 如何工作,我该如何做?

c++ - 构建 PBRT v2 错误 - 错误 1 ​​错误 U1077 : 'if' : return code '0x1'

C++ - 声明一个仅包含非连续索引值的数组

c++ - 判断点是否在矩形内

c++ - 就处理器时间而言,fmod 有多昂贵?