比较2个双精度,但C上没有所有数字

比较2个双精度,但C上没有所有数字,c,compare,double,C,Compare,Double,我想比较两个数字,但不包括所有数字。 例如,我有一个双精度的1.548799778和一个1.547990978,我想分别比较1.xx。我怎样才能把这个双精度“圆”到1.xx?? 感谢使用math.h中的函数来比较x和y是否足够接近,例如 (x==0.0 && y==0.0) || fabs(x-y)/max(fabs(x),fabs(y))<1e-6 (x==0.0&&y==0.0)| | fabs(x-y)/max(fabs(x),fabs(y))一种技术将使用如下tr

我想比较两个数字,但不包括所有数字。 例如,我有一个双精度的1.548799778和一个1.547990978,我想分别比较1.xx。我怎样才能把这个双精度“圆”到1.xx??
感谢

使用math.h中的函数来比较
x
y
是否足够接近,例如

(x==0.0 && y==0.0) || fabs(x-y)/max(fabs(x),fabs(y))<1e-6

(x==0.0&&y==0.0)| | fabs(x-y)/max(fabs(x),fabs(y))一种技术将使用如下
trunc
函数:

double d1, d2;
d1 = 1.548799778;
d2 = 1.547990978;
if (trunc(d1*100) == trunc(d2*100)) {
   // do your thing
}

使用
100
,因为需要两位小数。如果需要更多或更少的小数位数,可以使用其他数字。

另一种可能是只使用与公差的比较

 if (fabs(a - b) <= tolerance) { .... }

if(fabs(a-b)以下代码可能具有最快的执行时间,并且作为浮点变量的一般比较非常有用

if (  x-y < 0.01 && x-y > -0.01 )
if(x-y<0.01&&x-y>-0.01)

您可以使用
Math.h
函数

double check(double number)
{
    if (modf(number, 0) >= .5)
        return number >= 0 ? ceil(number) : floor(number);
    else
        return number < 0 ? ceil(number) : floor(number);
}

double round(double number, unsigned int places)
{
    double off = pow(10, places);
    return check(number * off) / off;
}

if(round(1.548799778, 2) == round(1.547990978, 2))
{
}
双重检查(双重编号)
{
if(modf(数字,0)>=0.5)
返回编号>=0?单元(编号):楼层(编号);
其他的
返回编号<0?单元(编号):楼层(编号);
}
双舍入(双位数,无符号整数位)
{
双关=功率(10个位置);
退货检查(编号*关)/关;
}
如果(圆形(1.548799778,2)=圆形(1.547990978,2))
{
}

如果需要,这应该是相当快速和可配置的。不引入额外的继承

int compare(double a, double b)
{
    static const double PRECISION = 0.0001;
    if (a < b)
        return b - a < PRECISION ? 0 : 1;
    else
        return a - b < PRECISION ? 0 : -1;
}
int比较(双a,双b)
{
静态常数双精度=0.0001;
if(a
你想要什么样的舍入?例如,向上舍入还是向下舍入?@AdrienPlisson:我删除了我的帖子…谢谢你的解释你想要舍入还是真的舍入?我有一个双1.xxxxxxxxxxxxxxxxxxxx(20),我想要1.xxxxxxxxxx(11)如果
a
b
都是很小的数字,比如
1e-6
2e-6
,公差为
1e-5
,那么可能无法很好地进行比较。请参阅我的答案以获得更好的建议。是的,这使用绝对公差,而您的方法使用相对公差erance,但是暴露的问题可以用这个方法解决,它只需要少量的数字,看起来是2,所以在这种情况下,这个方法应该足够了。我需要为此导入任何库吗?因为它说trunc在C99中无效。我尝试了1000000000以获得1.XXXXXXXXXXXXXX,但我得到了XXXXXXXXX.XXXXXX而不是“x==0&&y==0”我将简单地使用“x==y”,如果这两个数字相等,则速度更快。