2015-06-27 9 views
2

Я ищу надежный способ проверить, если два примитивная обертка Numbers (например Integer, Float, Double и т.д.) представляют собой одинаковые примитивные числа.тестирование, если два примитивных обертки числа представляют одинаковые примитивные номера

Например следующее, если заявление с участием двух примитивных чисел дает true:

int i = 100; 
double d = 100d; 
if (i == d) { 
    System.out.println("equal"); 
} 

Но следующее, если заявление, конечно, false поскольку Number экземпляры различных классов (Integer и Double):

int i = 100; 
double d = 100d; 
Number n1 = i; 
Number n2 = d; 
if (n1.equals(n2)) { 
    System.out.println("equal"); 
} 

Есть ли какой-то релятивный общий тест, чтобы увидеть, если два экземпляра Number (из которых я знаю, являются primi обертки) равны в том смысле, что их примитивные значения равны? В этом же контексте: существует ли некоторый надежный общий тест, чтобы увидеть, как экземпляры Number сравниваются друг с другом с другими условными операторами !=>, <, >= и <=?

На данный момент я пришел к следующему решению, но я не уверен, если это действительно надежно:

int i = 100; 
double d = 100d; 
Number n1 = i; 
Number n2 = d; 
if (n1.doubleValue() == n2.doubleValue()) { 
    System.out.println("equal"); 
} 
+0

Я думаю, что ваш путь хорош, так как вы обращаетесь к примитивным значениям, и вы делаете это, вызывая doubleValue, которые удостоверяются, что нет потерянных данных. –

ответ

1

Это некрасиво.

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

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

Затем выполните литье,

Затем сравните.


Ваше решение, бросить все, чтобы удвоить, будет работать в большинстве случаев, но это не будет работать для сравнения long значения, которые больше, чем около 2^56. Тип данных double не имеет достаточной точности для представления всех значений long, которые больше этого.

+0

Спасибо за информацию о проблеме с моим преобразованием в double. Я тоже думал о вашем предложенном подходе, но надеялся, что смогу как-то избежать отражения и проверки экземпляра ... – Balder

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

  • Нет связанных вопросов^_^