Что означает сравнение точности с Float.MAX_VALUE?

1

При чтении сообщения блога разработчиков Android на месте я наткнулся на этот бит кода (вырезать и вставить из блога):

List<String> matchingProviders = locationManager.getAllProviders();
for (String provider: matchingProviders) {
  Location location = locationManager.getLastKnownLocation(provider);
  if (location != null) {
    float accuracy = location.getAccuracy();
    long time = location.getTime();

    if ((time > minTime && accuracy < bestAccuracy)) {
      bestResult = location;
      bestAccuracy = accuracy;
      bestTime = time;
    }
    else if (time < minTime && 
         bestAccuracy == Float.MAX_VALUE && time > bestTime){
      bestResult = location;
      bestTime = time;
    }
  }
}

В то время как остальное довольно ясно, эта строка меня озадачила:

    else if (time < minTime && 
         bestAccuracy == Float.MAX_VALUE && time > bestTime){

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

Но что означает сравнение bestAccuracy с значением Max Float? Когда точность будет точно равна максимальному значению, которое может содержать float?

  • 0
    Похоже, разработчик ожидает, что любые полученные пользователем данные для bestAccuracy будут меньше, чем Float.MAX_VALUE. Почему он не использует отрицательное число вместо этого странно.
Теги:
android-location

2 ответа

2
Лучший ответ

Этот конкретный бит имеет больше смысла, если вы следуете его ссылке на весь исходный файл. Здесь немного больший фрагмент:

Location bestResult = null;
float bestAccuracy = Float.MAX_VALUE;
long bestTime = Long.MIN_VALUE;

// Iterate through all the providers on the system, keeping
// note of the most accurate result within the acceptable time limit.
// If no result is found within maxTime, return the newest Location.
List<String> matchingProviders = locationManager.getAllProviders();
for (String provider: matchingProviders) {
  Location location = locationManager.getLastKnownLocation(provider);
  if (location != null) {
    float accuracy = location.getAccuracy();
    long time = location.getTime();

    if ((time > minTime && accuracy < bestAccuracy)) {
      bestResult = location;
      bestAccuracy = accuracy;
      bestTime = time;
    }
    else if (time < minTime && bestAccuracy == Float.MAX_VALUE && time > bestTime) {
      bestResult = location;
      bestTime = time;
    }
  }
}

Очень просто, Float.MAX_VALUE является его значением по умолчанию для bestAccuracy и он просто проверяет, что он не уменьшил его в предыдущем предложении if.

  • 0
    Да, это имеет смысл с предыдущими несколькими строками. Спасибо!
2

Я предполагаю, что bestAccuracy был инициализирован Float.MAX_VALUE. Если это так, то код можно суммировать как: найти провайдера с наименьшей (лучшей?) Точностью со временем больше minTime. Если время больше, чем minTime, тогда просто возьмите тот, который находится ближе всего к minTime.

Это может быть реорганизовано из

    if ((time < minTime && accuracy < bestAccuracy)) {
      bestResult = location;
      bestAccuracy = accuracy;
      bestTime = time;
    }
    else if (time > minTime && bestAccuracy == Float.MAX_VALUE && time < bestTime) {
      bestResult = location;
      bestTime = time;
    }

в

    if ((time < minTime && accuracy < bestAccuracy)) {
      bestResult = location;
      bestAccuracy = accuracy;
      bestTime = time;
      foundWithinTimeLimit = true;
    }
    else if (time > minTime && !foundWithinTimeLimit && time < bestTime) {
      bestResult = location;
      bestTime = time;
    }

делает его немного яснее.

  • 0
    +1 за предоставление переработанного кода, который гораздо более читабелен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню