C++ 比较int和double时出错

C++ 比较int和double时出错,c++,perl,C++,Perl,我想做一个简单的函数来计算位数。我已经编写了一些功能,这些功能可以完美地工作,但我仍然坚持这一点: // The number I want to count the digits after the decimal long double d=33.56; // Going to modify d but I wan't to keep the original value long double dTemp=d; // v to store the part after the decima

我想做一个简单的函数来计算位数。我已经编写了一些功能,这些功能可以完美地工作,但我仍然坚持这一点:

// The number I want to count the digits after the decimal
long double d=33.56;
// Going to modify d but I wan't to keep the original value
long double dTemp=d;
// v to store the part after the decimal and e the part before
long double v, e;

v=modfl(dTemp,&e);

// j is the number of digit after the decimal
int j=0;
while(dTemp!=e)
{
    j++;
    dTemp*=10;
    v=modfl(dTemp,&e);
    std::cout<<"D = "<<dTemp<<" e = "<<e<<" v = "<<v<<std::endl;
}
std::cout<<"J = "<<j<<std::endl;
但是,如果您查看输出的第2行,您有:

D=3356 e=3356 v=2.27374e-1

因此,dTemp等于e,while循环仍在继续

我尝试的是:

  • 我想可能是因为d无法存储所需的数字。这就是为什么我用了长双人床

    • 我尝试了不同类型的变量,但结果总是一样的

直接检查浮点数/双精度数/长双精度数的等式/非等式不是一个好的做法。所以我建议用这样的方法

不平等:

while (abs(dTemp - e) > 1e-12) { ... }
相等:

while (abs(dTemp - e) < 1e-12) { ... }
输出为:

33.560001373291015625
33.56000000000000227373675443232059478759766
33.56000000000000227373675443232059478759766

因此,对于浮点数,1e-5可用于间隙值,对于双1e-14,在这种情况下似乎是正确的值。

直接检查浮点数/双精度/长双精度的等式/非等式不是一种好做法。所以我建议用这样的方法

不平等:

while (abs(dTemp - e) > 1e-12) { ... }
相等:

while (abs(dTemp - e) < 1e-12) { ... }
输出为:

33.560001373291015625
33.56000000000000227373675443232059478759766
33.56000000000000227373675443232059478759766

因此,在浮点数的情况下,1e-5可以用作间隙值,对于双1e-14,在这种情况下似乎是正确的值。

这样比较浮点数是不正确的。我建议您阅读有关浮点数的内容,然后看看以下问题:或者。我在visual studio和Ideone(c++14)中获得了不同的输出。计算什么中的位数?双精度中的二进制位数固定为53,十进制位数不确定。您的目的仍然不明确,可能无法实现。像这样比较浮点数是不正确的。我建议您阅读有关浮点数的内容,然后看看以下问题:或者。我在visual studio和Ideone(c++14)中获得了不同的输出。计算什么中的位数?双精度中的二进制位数固定为53,十进制位数不确定。您的目的仍然不明确,可能无法实现。我使用了这个函数
boolarame(double a,double b){return fabs(a-b)
来比较我的double,它现在可以工作了!我在学校里一直学到,你可以和我比两倍!感谢您的解释,使用此函数而不是标准函数来附加运算符==for double是不是一个坏主意?因为精度通常比1e-20差得多,所以答案被否决了。输出上显示的数字和内部存储的数字可能不同,可能在1e-20量级。因此,要更好地比较非整数数据,请使用上面显示的方法。@user31264您是对的!数字取决于实数的类型。M-Gregoire关于使用
std::numeric_limits::epsilon()
的评论听起来不错……我使用了这个函数
bool arame(double a,double b){return fabs(a-b)
来比较我的double,现在它可以工作了!我在学校里一直学到,你可以和我比两倍!感谢您的解释,使用此函数而不是标准函数来附加运算符==for double是不是一个坏主意?因为精度通常比1e-20差得多,所以答案被否决了。输出上显示的数字和内部存储的数字可能不同,可能在1e-20量级。因此,要更好地比较非整数数据,请使用上面显示的方法。@user31264您是对的!数字取决于实数的类型。M-Gregoire关于使用
std::numeric\u limits::epsilon()
的评论听起来不错。。。