Сравните, что значение BigDecimal и значение double равны двум десятичным разрядам

Я работаю с API, который возвращает двойное значение. Мне нужно сравнить это значение с BigDecimal для равенства двух знаков после запятой.

Должен ли я конвертировать BigDecimal в двойной, а затем сравнить

Math.abs(myBigDecimal.doubleValue() - apiDouble) >= .01

Или есть проблемы с этим подходом? Возможно, мне следует преобразовать двойной в BigDecimal, а затем сравнить?

2 ответа

Нет. Хотя IEEE double имеет защитные биты, он не может точно представлять десятичное значение. Преобразуйте двойное в BigDecimal, используя округление, а затем используйте compareTo(). Обратите внимание, что метод equals() учитывает десятичные позиции, поэтому метод CompareTo () безопаснее. Возможно, вам также понадобится округлить BigDecimal.

Сдвиньте требуемые десятичные позиции, умножив оба значения на 100, используйте Math.ceil или Math.floor, как вам больше нравится, чтобы избавиться от остальных десятичных позиций:

Math.ceil(myBigDecimal.doubleValue()*100) == Math.ceil(apiDouble*100)

это эквивалентно усечению без округления. Если вас беспокоит округление, умножьте на 1000, приведите к длинному, разделите на 10 и сравните.

Другие вопросы по тегам