2015-04-10 2 views
0

У меня есть метод, который сравнивает любой список, заполненный объектами DMatch в соответствии с атрибутом distance. проблема ıA м имеющий теперь, расстояние я получаю от отсортированного списка что-то вроде:числовая точность теряется после сортировки списка с использованием компаратора

Debug: MainClass -> descriptorMatcher: Min_Dist: 0.070726834 
Debug: MainClass -> descriptorMatcher: Max_Dist: 0.5799786 

в то время как оно должно быть, как:

Info: MainClass -> descriptorMatcher: Max_Dist: 0.5799785852432251 
Info: MainClass -> descriptorMatcher: Min_Dist: 0.07072683423757553 

почему я теряю числовую точность и как избежать Это.

Код:

public static List<DMatch> getTopGoodMatches(List<DMatch> list, int startIndx, int range) { 
    if (list != null) { 
     if (!list.isEmpty()) { 

      if (range != 0) { 
       if ((startIndx + range) <= list.size()){ 
        Log.V(TAG, "getTopGoodMatches", range + " match line(s) will be drawn"); 
        Collections.sort(list, ascOrder); 
        return list.subList(startIndx, (startIndx + range)); 
       } else { 
        Log.E(TAG, "getTopGoodMatches", "(startIndx + range) must be <= the total list size"); 
        return null; 
       } 
      } else { 
       Log.E(TAG, "main", "range can not be zero"); 
       return null; 
      } 

     } else { 
      Log.E(TAG, "getTopGoodMatches", "the list you passed to this method is empty, empty list can not be sorted."); 
      return null; 
     } 
    } else { 
     Log.E(TAG, "getTopGoodMatches", "the list you passed to this method is null, null object can not be sorted."); 
     return null; 
    } 
} 

private static Comparator<DMatch> ascOrder = new Comparator<DMatch>() { 

    public int compare(DMatch arg0, DMatch arg1) { 
     // TODO Auto-generated method stub 
     return Double.compare(arg0.distance, arg1.distance); 
    } 
}; 

ответ

2

Если вам нужно иметь десятичные значения произвольной точности вы не можете использовать float или double. Вместо этого используйте BigDecimal. Или преобразуйте его в не десятичное значение (int, long) и позаботитесь о количестве десятичных цифр в вашей логике.

См http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html

+0

я не знаю, почему я не имею права использовать BigDecimal? каждый раз, когда я использую его, затмение выделяет его красным цветом и предлагает преобразовать его в float? любая идея пожалуйста – rmaik

+0

BigDecimal - это класс. Таким образом, вы не можете использовать стандартные операторы для выполнения операций. Поэтому вместо + вы должны использовать .add вместо - .minus и так далее. Прочтите javadoc из BigDecimal –

+0

, но, как вы видите в методе компаратора, опубликованном выше, у меня нет - или +, и когда я использую BigDecimal.compare .... я получаю ошибки – rmaik

Смежные вопросы