C++ 终止小数 #包括 #包括 #包括 使用名称空间std; int main() { 双a、b、res; 而(cin>>a>>b) { res=a/b; 如果((res*b)==a) cout

C++ 终止小数 #包括 #包括 #包括 使用名称空间std; int main() { 双a、b、res; 而(cin>>a>>b) { res=a/b; 如果((res*b)==a) cout,c++,floating-point,precision,C++,Floating Point,Precision,只有1/2、1/4、1/8等分数(或这些分数的总和)在double中精确表示。所有其他分数都是近似值。因此,1/5*5的结果可能等于0.9999999999 这就是为什么人们永远不应该比较浮点数是否相等(至少在没有所需精度的情况下,比如testedValue-num

只有1/2、1/4、1/8等分数(或这些分数的总和)在
double
中精确表示。所有其他分数都是近似值。因此,
1/5*5
的结果可能等于
0.9999999999


这就是为什么人们永远不应该比较浮点数是否相等(至少在没有所需精度的情况下,比如
testedValue-num
)。

在您的例子10中,有一种简单的方法可以询问比率是否在给定的基数中具有精确的终止表示

第一步是把它降到最低,用最高公因数除以顶部和底部


现在只有分母才重要。如果它的每一个素数因子也是基数的素数因子,则分数将以该基数终止。5是10的素数因子,因此1/5以十进制终止。5不是2的素数因子,因此1/5不以二进制终止。

在二进制算术中,1/5是非终止分数。您能解释一下吗更多详情请@PatriciaShanahanok,我有点明白了@patriciashanahan那么我在这里能做什么?@hcorg选择一个精度进行比较,或者使用一些库处理分数。定点算法可能会有所帮助(例如,提高多精度)我正在解决的问题是:取2个整数a和b输入并检查终止小数的a/b结果。我将输入作为双原因int/int除法将导致整数和向上转换将导致相同的结果@hcorg使用浮点算术无法做到这一点,但您不需要使用它-请参阅其他答案:)
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;

int main()
{
double a,b,res;

while(cin>>a>>b)
{
    res = a/b;

    if((res*b) == a)
        cout<<"Terminates"<<endl;
    else
        cout<<"Does not terminate"<<endl;
}

return 0;
}