Сравнение с плавающей точкой дает неверный результат и точность изменений - PullRequest
0 голосов
/ 20 марта 2019

У меня есть номер версии 1.1, 1.2, 1.3, и мне нужно проверить версию меньше или больше 1.2, но при отладке я получаю неправильный ответ, чем ожидалось

    float versionNumber = versinInfo.toFloat();
    static float const VERSION_NUMBER(1.2);
    if(abs((versionNumber - VERSION_NUMBER) <= 0.001))
    {
      // do operation
    }

номер версии приходит 1.10000005, но я хочу изменитьпроверьте от 0,001 до 0,0000005, но это не может быть правильным исправлением

, пожалуйста, предложите лучший метод

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Номера версий являются целыми числами. У вас уже есть класс, у этого класса должно быть целочисленное значение для основной версии и целочисленная версия для вспомогательной версии, а также операторы сравнения (это то, что вы пытаетесь сделать).

В других схемах даже есть третье целое число патча, строка для альфа / RC ... Реализуйте это правильно в классе, который использует правильную семантику (т. Е. Метод с именем is_one_minor_version_away, где вы правильно тестируете, есть только одна второстепенная версия) меняется).

А что будет, если в вашем случае это 2.9 против 3.0?

1 голос
/ 20 марта 2019

Почему бы вам не создать класс, содержащий основную версию и вспомогательную версию переданного versionInfo, и добавить туда логику для проверки.Идея состояла бы в том, чтобы не анализировать это как число с плавающей точкой, а отделить его запятой и принять эту информацию как int.

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