Сравните 2 двойных, но без всех цифр на C - PullRequest
5 голосов
/ 27 ноября 2011

Я хочу сравнить 2 двойных, но без всех цифр. например, у меня есть этот двойной 1.548799778 и 1.547990978, и я хочу сравнить 1.xx от каждого. Как я могу "округлить" этот дубль до 1.xx ?? Спасибо

Ответы [ 7 ]

5 голосов
/ 27 ноября 2011

Одна техника будет использовать функцию trunc, например:

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

Использование 100, потому что вы хотите два десятичных знака. Вы можете использовать другие числа, если хотите больше или меньше десятичных знаков.

4 голосов
/ 27 ноября 2011

для сравнения, что x и y достаточно близко, что-то вроде

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

для округления x используйте floor(x) или ceil(x), как предложено Яном Ворчаком

Приложения : Я не уверен, что это будет работать для NaN (подробности вызывают головную боль)

2 голосов
/ 27 ноября 2011

Другая возможность - просто использовать сравнение с допуском.

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

выберите свою терпимость в зависимости от точности

Например, вы можете выбрать допуск равным 0,001, чтобы использовать первые 2 цифры.

0 голосов
/ 27 ноября 2011

это должно быть значительно быстрее и настраиваться при необходимости. дополнительное наследование не вводится

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;
}
0 голосов
/ 27 ноября 2011

вы можете использовать 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))
{
}
0 голосов
/ 27 ноября 2011

Следующее может иметь самое быстрое время выполнения, и это полезно для общего сравнения переменных с плавающей запятой.

if (  x-y < 0.01 && x-y > -0.01 )
0 голосов
/ 27 ноября 2011

использование этаж или ceil функция из математического плана

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...