Сравнение становится немного сложнее, потому что BigDecimal и BigInteger также расширяют Number. Эти классы могут содержать целочисленные значения неограниченного размера (ну, ограниченные памятью на вашем компьютере).
Таким образом, если вы запрашиваете их двойное или длинное значение, вы можете рискнуть ошибочными сравнениями, поскольку BigDecimal или BigInteger будут вынуждены урезать их значение.
Самое безопасное, что нужно сделать, это преобразовать Number в строку и затем передать эту строку классу BigDecimal для анализа.
например.
Number n = ...;
int i = ...;
BigDecimal m = new BigDecimal(n.toString());
BigDecimal j = new BigDecimal(i);
boolean result = j.compareTo(m) < 0;
// equivalent to i < n
Если вы уверены, что никогда не получите экземпляр BigInteger или BigDecimal, значение которого превышает максимальное положительное или максимальное отрицательное значение типа double, тогда будет безопасно использовать Number.doubleValue, чтобы получить число для сравнения.
Существуют дополнительные проблемы, с которыми вы можете столкнуться при возможности сравнения BigDecimals. Это потому, что BigDecimals представляют свои значения в базе 10, тогда как другие подклассы Number используют базу 2.
Как таковой new BigDecimal("0.1")
не равен 0.1d
или 0.1f
. Это связано с тем, что числа с плавающей запятой и числа с двойными числами не могут точно представлять многие дробные числа 10 (тогда как BigDecimal может) Таким образом, получение двойного значения из BigDecimal может привести к ошибочным сравнениям. Но поскольку вы сравниваете его с целыми числами, это проблема, с которой вам не нужно сталкиваться.