13.2. Java – Метод compareTo()
Метод compareTo() – сравнивает числовой объект, который вызывает метод, с аргументом. При работе с числами метод compareTo() в Java позволяет сравнить два числа одного типа, например, byte, long, integer и т.д. Однако нельзя сравнивать два разных типа аргумента и числового объекта, вызывая метод они должны быть одного типа.
Синтаксис
public int compareTo( NumberSubClass referenceName )
Параметры
Подробная информация о параметрах:
- referenceName – должно быть byte, double, integer, float, long или short.
Возвращаемое значение
- Если Integer равно аргументу, то возвращается 0.
- Если Integer меньше, чем аргумент, то возвращается -1.
- Если Integer больше, чем аргумент, то возвращается 1.
Пример
public class Test < public static void main(String args[])< Integer x = 5; System.out.println(x.compareTo(3)); System.out.println(x.compareTo(5)); System.out.println(x.compareTo(8)); >>
Будет получен следующий результат:
1 0 -1
Оглавление
- 1. Java – Самоучитель для начинающих
- 2. Java – Обзор языка
- 3. Java – Установка и настройка
- 4. Java – Синтаксис
- 5. Java – Классы и объекты
- 6. Java – Конструкторы
- 7. Java – Типы данных и литералы
- 8. Java – Типы переменных
- 9. Java – Модификаторы
- 10. Java – Операторы
- 11. Java – Циклы и операторы цикла
- 11.1. Java – Цикл while
- 11.2. Java – Цикл for
- 11.3. Java – Улучшенный цикл for
- 11.4. Java – Цикл do..while
- 11.5. Java – Оператор break
- 11.6. Java – Оператор continue
- 12. Java – Операторы принятия решений
- 12.1. Java – Оператор if
- 12.2. Java – Оператор if..else
- 12.3. Java – Вложенный оператор if
- 12.4. Java – Оператор switch..case
- 12.5. Java – Условный оператор (? 🙂
- 13. Java – Числа
- 13.1. Java – Методы byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()
- 13.2. Java – Метод compareTo()
- 13.3. Java – Метод equals()
- 13.4. Java – Метод valueOf()
- 13.5. Java – Метод toString()
- 13.6. Java – Метод parseInt()
- 13.7. Java – Метод Math.abs()
- 13.8. Java – Метод Math.ceil()
- 13.9. Java – Метод Math.floor()
- 13.10. Java – Метод Math.rint()
- 13.11. Java – Метод Math.round()
- 13.12. Java – Метод Math.min()
- 13.13. Java – Метод Math.max()
- 13.14. Java – Метод Math.exp()
- 13.15. Java – Метод Math.log()
- 13.16. Java – Метод Math.pow()
- 13.17. Java – Метод Math.sqrt()
- 13.18. Java – Метод Math.sin()
- 13.19. Java – Метод Math.cos()
- 13.20. Java – Метод Math.tan()
- 13.21. Java – Метод Math.asin()
- 13.22. Java – Метод Math.acos()
- 13.23. Java – Метод Math.atan()
- 13.24. Java – Метод Math.atan2()
- 13.25. Java – Метод Math.toDegrees()
- 13.26. Java – Метод Math.toRadians()
- 13.27. Java – Метод Math.random()
- 14. Java – Символы
- 14.1. Java – Метод Character.isLetter()
- 14.2. Java – Метод Character.isDigit()
- 14.3. Java – Метод Character.isWhitespace()
- 14.4. Java – Метод Character.isUpperCase()
- 14.5. Java – Метод Character.isLowerCase()
- 14.6. Java – Метод Character.toUpperCase()
- 14.7. Java – Метод Character.toLowerCase()
- 14.8. Java – Метод Character.toString()
- 15. Java – Строки
- 15.1. Java – Метод charAt()
- 15.2. Java – Метод compareTo()
- 15.3. Java – Метод compareToIgnoreCase()
- 15.4. Java – Метод concat()
- 15.5. Java – Метод contentEquals()
- 15.6. Java – Метод copyValueOf()
- 15.7. Java – Метод endsWith()
- 15.8. Java – Метод equals()
- 15.9. Java – Метод equalsIgnoreCase()
- 15.10. Java – Метод getBytes()
- 15.11. Java – Метод getChars()
- 15.12. Java – Метод hashCode()
- 15.13. Java – Метод indexOf()
- 15.14. Java – Метод intern()
- 15.15. Java – Метод lastIndexOf()
- 15.16. Java – Метод length()
- 15.17. Java – Метод matches()
- 15.18. Java – Метод regionMatches()
- 15.19. Java – Метод replace()
- 15.20. Java – Метод replaceAll()
- 15.21. Java – Метод replaceFirst()
- 15.22. Java – Метод split()
- 15.23. Java – Метод startsWith()
- 15.24. Java – Метод subSequence()
- 15.25. Java – Метод substring()
- 15.26. Java – Метод toCharArray()
- 15.27. Java – Метод toLowerCase()
- 15.28. Java – Метод toString()
- 15.29. Java – Метод toUpperCase()
- 15.30. Java – Метод trim()
- 15.31. Java – Метод valueOf()
- 15.32. Java – Классы StringBuilder и StringBuffer
- 15.32.1. Java – Метод append()
- 15.32.2. Java – Метод reverse()
- 15.32.3. Java – Метод delete()
- 15.32.4. Java – Метод insert()
- 15.32.5. Java – Метод replace()
- 16. Java – Массивы
- 17. Java – Дата и время
- 18. Java – Регулярные выражения
- 19. Java – Методы
- 20. Java – Потоки ввода/вывода, файлы и каталоги
- 20.1. Java – Класс ByteArrayInputStream
- 20.2. Java – Класс DataInputStream
- 20.3. Java – Класс ByteArrayOutputStream
- 20.4. Java – Класс DataOutputStream
- 20.5. Java – Класс File
- 20.6. Java – Класс FileReader
- 20.7. Java – Класс FileWriter
- 21. Java – Исключения
- 21.1. Java – Встроенные исключения
- 22. Java – Вложенные и внутренние классы
- 23. Java – Наследование
- 24. Java – Переопределение
- 25. Java – Полиморфизм
- 26. Java – Абстракция
- 27. Java – Инкапсуляция
- 28. Java – Интерфейсы
- 29. Java – Пакеты
- 30. Java – Структуры данных
- 30.1. Java – Интерфейс Enumeration
- 30.2. Java – Класс BitSet
- 30.3. Java – Класс Vector
- 30.4. Java – Класс Stack
- 30.5. Java – Класс Dictionary
- 30.6. Java – Класс Hashtable
- 30.7. Java – Класс Properties
- 31. Java – Коллекции
- 31.1. Java – Интерфейс Collection
- 31.2. Java – Интерфейс List
- 31.3. Java – Интерфейс Set
- 31.4. Java – Интерфейс SortedSet
- 31.5. Java – Интерфейс Map
- 31.6. Java – Интерфейс Map.Entry
- 31.7. Java – Интерфейс SortedMap
- 31.8. Java – Класс LinkedList
- 31.9. Java – Класс ArrayList
- 31.10. Java – Класс HashSet
- 31.11. Java – Класс LinkedHashSet
- 31.12. Java – Класс TreeSet
- 31.13. Java – Класс HashMap
- 31.14. Java – Класс TreeMap
- 31.15. Java – Класс WeakHashMap
- 31.16. Java – Класс LinkedHashMap
- 31.17. Java – Класс IdentityHashMap
- 31.18. Java – Алгоритмы Collection
- 31.19. Java – Iterator и ListIterator
- 31.20. Java – Comparator
- 32. Java – Дженерики
- 33. Java – Сериализация
- 34. Java – Сеть
- 34.1. Java – Обработка URL
- 35. Java – Отправка Email
- 36. Java – Многопоточность
- 36.1. Java – Синхронизация потоков
- 36.2. Java – Межпоточная связь
- 36.3. Java – Взаимная блокировка потоков
- 36.4. Java – Управление потоками
- 37. Java – Основы работы с апплетами
- 38. Java – Javadoc
Как сравнить 2 числа в java
В Java для сравнения двух чисел используется операторы сравнения.
Операторы сравнения в Java:
- == — сравнение на равенство;
- != — сравнение на неравенство;
- > — больше;
- >= — больше или равно;
- < - меньше;
Пример кода для сравнения двух чисел:
int a = 5; int b = 7; if (a > b) System.out.println("a больше b"); > else if (a b) System.out.println("b больше a"); > else System.out.println("a и b равны"); >
Как сравнить числа в java
Например, чтобы сравнить два числа, можно написать следующий код:
int a = 5; int b = 7; if (a b) System.out.println("a меньше b"); > else if (a > b) System.out.println("a больше b"); > else System.out.println("a равно b"); >
Также, для сравнения чисел можно использовать методы класса Double или Float в зависимости от типа чисел, например:
double a = 5.6; double b = 7.8; if (Double.compare(a, b) 0) System.out.println("a меньше b"); > else if (Double.compare(a, b) > 0) System.out.println("a больше b"); > else System.out.println("a равно b"); >
Здесь мы используем статический метод compare() класса Double для сравнения двух чисел типа double . Этот метод возвращает отрицательное число, если первый аргумент меньше второго, положительное число, если первый аргумент больше второго, и ноль, если аргументы равны.
Как сравнить два числа в java
Подскажите плз утилитку — сравнения двух произвольных Number’ов, что-то с ходу в apache-commons не нашел.
Re: Сравнить два Number
| От: | Blazkowicz |
| Дата: | 28.05.09 12:43 |
| Оценка: |
Здравствуйте, Antei, Вы писали:
A>Подскажите плз утилитку — сравнения двух произвольных Number’ов, что-то с ходу в apache-commons не нашел.
В исходниках к groovy видел что делают Number->toString->BigDecimal
Это, вроде как, единственный вариант для абсолютно всех Number. Можно что-то попридумывать, если подмножество Number известно.
Re[2]: Сравнить два Number
| От: | Antei |
| Дата: | 28.05.09 12:50 |
| Оценка: |
Здравствуйте, Blazkowicz, Вы писали:
B>В исходниках к groovy видел что делают Number->toString->BigDecimal
B>Это, вроде как, единственный вариант для абсолютно всех Number. Можно что-то попридумывать, если подмножество Number известно.
Попридумывать — это да можно.
Уверен что это уже кто-то писал, осталось только найти
Гугль выдал вот что-то org.apache.velocity.runtime.parser.node.MathUtils
Re: Сравнить два Number
| От: | Donz | http://donz-ru.livejournal.com |
| Дата: | 28.05.09 14:35 | |
| Оценка: | 12 (1) -1 | |
Здравствуйте, Antei, Вы писали:
A>Подскажите плз утилитку — сравнения двух произвольных Number’ов, что-то с ходу в apache-commons не нашел.
Ради интереса, должны ли быть равны эти числа: BigDecimal.valueof( 150, 2 ) и new Double( 1.5 )?
Re[2]: Сравнить два Number
| От: | Blazkowicz |
| Дата: | 28.05.09 14:42 |
| Оценка: |
Здравствуйте, Donz, Вы писали:
A>>Подскажите плз утилитку — сравнения двух произвольных Number’ов, что-то с ходу в apache-commons не нашел.
D>Ради интереса, должны ли быть равны эти числа: BigDecimal.valueof( 150, 2 ) и new Double( 1.5 )?
Вчера сходный вопрос всплыл на другом сайте. Чувтсвовал что точность double где-то может боком выйти, но не смог придумать примера.
Re[2]: Сравнить два Number
| От: | Antei |
| Дата: | 28.05.09 14:52 |
| Оценка: |
Здравствуйте, Donz, Вы писали:
D>Здравствуйте, Antei, Вы писали:
A>>Подскажите плз утилитку — сравнения двух произвольных Number’ов, что-то с ходу в apache-commons не нашел.
D>Ради интереса, должны ли быть равны эти числа: BigDecimal.valueof( 150, 2 ) и new Double( 1.5 )?
Если говорить о реализации подобного сравнения (что здесь оффтоп), то, конечно, можно предусмотреть отдельные ветки для сравнения decimal и floating point numbers. Скорее всего ситуации, когда BigDecimal и Double надо сравнить — бывают. Здесь просто делаются какие-то допущения, которые описываются в доке (значения приводятся к наиболее точному типу или что-то вроде).
Re[3]: Сравнить два Number
| От: | Donz | http://donz-ru.livejournal.com |
| Дата: | 28.05.09 16:02 | |
| Оценка: | +1 | |
Здравствуйте, Antei, Вы писали:
D>>Ради интереса, должны ли быть равны эти числа: BigDecimal.valueof( 150, 2 ) и new Double( 1.5 )?
A>Если говорить о реализации подобного сравнения (что здесь оффтоп), то, конечно, можно предусмотреть отдельные ветки для сравнения decimal и floating point numbers. Скорее всего ситуации, когда BigDecimal и Double надо сравнить — бывают. Здесь просто делаются какие-то допущения, которые описываются в доке (значения приводятся к наиболее точному типу или что-то вроде).
Почему оффтоп, по-моему, вопрос очень даже в тему. Под определение «произвольный Number» оба класса подпадают.
Я к тому, что общепринятого сравнения всех Numbers нет. А раз так, то нет смысла искать сторонние классы, которые производят сравнения по своим правилам, которые на момент написания казались логичным их разработчику. То есть, для точного следования конкретным правилам надо написать свою реализацию, разве что можно подсмотреть общий алгоритм.
Если оперируете только целыми числами без запредельных значений, то Number.longValue() и вперед.
Re[3]: Сравнить два Number
| От: | Donz | http://donz-ru.livejournal.com |
| Дата: | 28.05.09 16:03 | |
| Оценка: |
Здравствуйте, Blazkowicz, Вы писали:
D>>Ради интереса, должны ли быть равны эти числа: BigDecimal.valueof( 150, 2 ) и new Double( 1.5 )?
B>Вчера сходный вопрос всплыл на другом сайте. Чувтсвовал что точность double где-то может боком выйти, но не смог придумать примера.
Безупречный пример — деньги и бухотчетность по ним. За копейку линчуют
Re[4]: Сравнить два Number
| От: | Antei |
| Дата: | 28.05.09 16:10 |
| Оценка: |
Здравствуйте, Donz, Вы писали:
D>Здравствуйте, Blazkowicz, Вы писали:
D>>>Ради интереса, должны ли быть равны эти числа: BigDecimal.valueof( 150, 2 ) и new Double( 1.5 )?
B>>Вчера сходный вопрос всплыл на другом сайте. Чувтсвовал что точность double где-то может боком выйти, но не смог придумать примера.
D>Безупречный пример — деньги и бухотчетность по ним. За копейку линчуют
Верно, только Double и Float тут не причем . В бух программах деньги хранят в decimal’ах с большой точностью, но не в в типах с плавающей точкой.
Re[2]: Сравнить два Number
| От: | Donz | http://donz-ru.livejournal.com |
| Дата: | 28.05.09 16:18 | |
| Оценка: |
Здравствуйте, Donz, Вы писали:
A>>Подскажите плз утилитку — сравнения двух произвольных Number’ов, что-то с ходу в apache-commons не нашел.
D>Ради интереса, должны ли быть равны эти числа: BigDecimal.valueof( 150, 2 ) и new Double( 1.5 )?
Под конец дня мозг едет
Конкретно данный пример будет действительно равен. Надо было взять 1.4, например, то есть чтобы в дроби не было знаменателя — степени двойки.
Re: Сравнить два Number
| От: | mkizub | http://symade.tigris.org |
| Дата: | 28.05.09 18:15 | |
| Оценка: |
Здравствуйте, Antei, Вы писали:
A>Подскажите плз утилитку — сравнения двух произвольных Number’ов, что-то с ходу в apache-commons не нашел.
Если я напишу class Complex extends Number — для него тоже должно работать?
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
Re[4]: Сравнить два Number
| От: | Antei |
| Дата: | 28.05.09 18:59 |
| Оценка: |
Здравствуйте, Donz, Вы писали:
D>Почему оффтоп, по-моему, вопрос очень даже в тему. Под определение «произвольный Number» оба класса подпадают.
D>Я к тому, что общепринятого сравнения всех Numbers нет. А раз так, то нет смысла искать сторонние классы, которые производят сравнения по своим правилам, которые на момент написания казались логичным их разработчику. То есть, для точного следования конкретным правилам надо написать свою реализацию, разве что можно подсмотреть общий алгоритм.
D>Если оперируете только целыми числами без запредельных значений, то Number.longValue() и вперед.
В принципе, меня интересовал определенный набор стандартных Number’ов и мне было бы достаточно даже только целых и decimal. Но и в сравнении decimal с FP нет ничего военного. В конечном счете любой неналовый Number представляет из себя совершенно конкретную точку на оси ) и проблема их сравнения носит технический характер. Думаю что способ сравнения через toString() и BigDecimal что упоминал Blazkowicz — довольно универсальный, правда его эффективность вызывает большие сомнения.
Re[5]: Сравнить два Number
| От: | Antei |
| Дата: | 28.05.09 19:30 |
| Оценка: |
Вот, нашел вполне вменяемую реализацию
/** * The constants are used to determine in which context we have to calculate. */ protected static final int BASE_LONG = 0; protected static final int BASE_FLOAT = 1; protected static final int BASE_DOUBLE = 2; protected static final int BASE_BIGINTEGER = 3; protected static final int BASE_BIGDECIMAL = 4; /** * Compare two numbers. * @param op1 * @param op2 * @return 1 if n1 > n2, -1 if n1 < n2 and 0 if equal. */public static int compare (Number op1, Number op2) < int calcBase = findCalculationBase( op1, op2); switch (calcBase) < case BASE_BIGINTEGER: return toBigInteger( op1 ).compareTo( toBigInteger( op2 )); case BASE_LONG: long l1 = op1.longValue(); long l2 = op2.longValue(); if (l1 < l2) < return -1; > if (l1 > l2) < return 1; > return 0; case BASE_FLOAT: float f1 = op1.floatValue(); float f2 = op2.floatValue(); if (f1 < f2) < return -1; > if (f1 > f2) < return 1; > return 0; case BASE_DOUBLE: double d1 = op1.doubleValue(); double d2 = op2.doubleValue(); if (d1 < d2) < return -1; > if (d1 > d2) < return 1; > return 0; // Default is BigDecimal operation default: return toBigDecimal( op1 ).compareTo( toBigDecimal ( op2 )); > > /** * Find the common Number-type to be used in calculations. * * @param op1 first operand of binary operation * @param op2 second operand of binary operation * @return constant indicating type of Number to use in calculations */ private static int findCalculationBase (Number op1, Number op2) < boolean op1Int = isInteger(op1); boolean op2Int = isInteger(op2); if ( (op1 instanceof BigDecimal || op2 instanceof BigDecimal) || ( (!op1Int || !op2Int) && (op1 instanceof BigInteger || op2 instanceof BigInteger)) ) < return BASE_BIGDECIMAL; > if (op1Int && op2Int) < if (op1 instanceof BigInteger || op2 instanceof BigInteger) < return BASE_BIGINTEGER; > return BASE_LONG; > if ((op1 instanceof Double) || (op2 instanceof Double)) < return BASE_DOUBLE; > return BASE_FLOAT; > /** * Convert the given Number to a BigDecimal * @param n * @return The number as BigDecimal */ public static BigDecimal toBigDecimal (Number n) < if (n instanceof BigDecimal) < return (BigDecimal)n; > if (n instanceof BigInteger) < return new BigDecimal ( (BigInteger)n ); > return new BigDecimal (n.doubleValue()); >
Re[3]: Сравнить два Number
| От: | KRA |
| Дата: | 28.05.09 20:21 |
| Оценка: |
Здравствуйте, Blazkowicz, Вы писали:
B>Вчера сходный вопрос всплыл на другом сайте. Чувтсвовал что точность double где-то может боком выйти, но не смог придумать примера.
Пример из жизни. Из файла excel через Apache POI вычитывается значение как double. Это значение является расчитываемым полем (комиссия банка в копейках) и может быть дробным, при импорте нужно округлить.
В файле хранится значение скажем 2.5. При вычитке его как double изза невозможности представить такое число в бинарном виде, оно представляется как 2.49999999997. После округления получаем 2, вместо 3.
Re[2]: Сравнить два Number
| От: | vb-develop |
| Дата: | 29.05.09 07:07 |
| Оценка: |
Здравствуйте, Donz, Вы писали:
D>Здравствуйте, Antei, Вы писали:
A>>Подскажите плз утилитку — сравнения двух произвольных Number’ов, что-то с ходу в apache-commons не нашел.
D>Ради интереса, должны ли быть равны эти числа: BigDecimal.valueof( 150, 2 ) и new Double( 1.5 )?
Объекты разных классов, поэтому автоматически не должны быть равны. Хотя неизвестно еще автору сабжа требуется в этом случае. Подозреваю что математическое сравнение, с точностью до заданной постоянной.
Re[4]: Сравнить два Number
| От: | Donz | http://donz-ru.livejournal.com |
| Дата: | 29.05.09 09:07 | |
| Оценка: |
Здравствуйте, KRA, Вы писали:
B>>Вчера сходный вопрос всплыл на другом сайте. Чувтсвовал что точность double где-то может боком выйти, но не смог придумать примера.
KRA>Пример из жизни. Из файла excel через Apache POI вычитывается значение как double. Это значение является расчитываемым полем (комиссия банка в копейках) и может быть дробным, при импорте нужно округлить.
KRA>В файле хранится значение скажем 2.5. При вычитке его как double изза невозможности представить такое число в бинарном виде, оно представляется как 2.49999999997. После округления получаем 2, вместо 3.
Уже писал ниже насчет своего неудачного примера. Конкретно в случае с 2.5 никаких проблем с даблом не будет 2.5 = 2^1 + 2^(-1)
Re[6]: Сравнить два Number
| От: | Donz | http://donz-ru.livejournal.com |
| Дата: | 29.05.09 11:42 | |
| Оценка: |
Здравствуйте, Antei, Вы писали:
А>Но и в сравнении decimal с FP нет ничего военного.
Привели же примеры, что одинаково проинициализированные объекты BigDecimal и Double не будут равны по значению.
A>Вот, нашел вполне вменяемую реализацию
. и в этой реализации этот баг как раз и всплывет.
Re[7]: Сравнить два Number
| От: | Antei |
| Дата: | 29.05.09 12:10 |
| Оценка: |
Здравствуйте, Donz, Вы писали:
A>>Вот, нашел вполне вменяемую реализацию
D>. и в этой реализации этот баг как раз и всплывет.
Ну, во первых это не баг, а особенность хранения значения в fp. Во вторых это никак не относится к сравнению, т.к. значение у вас меняется при инициализации, но не при сравнении.
Re[8]: Сравнить два Number
| От: | KRA |
| Дата: | 29.05.09 12:13 |
| Оценка: |
Здравствуйте, Antei, Вы писали:
A>Здравствуйте, Donz, Вы писали:
A>>>Вот, нашел вполне вменяемую реализацию
D>>. и в этой реализации этот баг как раз и всплывет.
A>Ну, во первых это не баг, а особенность хранения значения в fp. Во вторых это никак не относится к сравнению, т.к. значение у вас меняется при инициализации, но не при сравнении.
ИМХО, сравнение должно учитывать эту особенность хранения.
Иначе, пользователям так и говорить: то что вы видете два одинаковых числа, а написано, что они разные, так это не баг сравнения
Re[7]: Сравнить два Number
| От: | Antei |
| Дата: | 29.05.09 12:18 |
| Оценка: |
Здравствуйте, Donz, Вы писали:
D>Здравствуйте, Antei, Вы писали:
А>>Но и в сравнении decimal с FP нет ничего военного.
D>Привели же примеры, что одинаково проинициализированные объекты BigDecimal и Double не будут равны по значению.
A>>Вот, нашел вполне вменяемую реализацию
D>. и в этой реализации этот баг как раз и всплывет.
public static BigDecimal toBigDecimal (Number n) < if (n instanceof BigDecimal) < return (BigDecimal)n; > if (n instanceof BigInteger) < return new BigDecimal ( (BigInteger)n ); > return new BigDecimal (n.doubleValue()); >
См. toBigDecimal(). лень проверять, но тут как раз BigDecimal которое ==1.5 превратится в double, которое будет равно исходному double.