Подтвердить что ты не робот

Преобразование Java-номера в BigDecimal: лучший способ

Я ищу лучший способ преобразования числа в BigDecimal.

Достаточно ли это?

Number number;
BigDecimal big = new BigDecimal(number.toString());

Можем ли мы потерять точность с помощью метода toString()?

4b9b3361

Ответ 1

Это прекрасно, помните, что использование конструктора BigDecimal для объявления значения может быть опасным, если оно не относится к типу String. Рассмотрим ниже...

BigDecimal valDouble = new BigDecimal(0.35);
System.out.println(valDouble);

Это не будет печатать 0.35, это будет infact быть...

0.34999999999999997779553950749686919152736663818359375

Я бы сказал, что ваше решение, вероятно, является самым безопасным из-за этого.

Ответ 2

Можно ли потерять точность с помощью метода toString()?

Вид... Оба Float.toString() и Double.toString() выводят только количество цифр после десятичного разделителя, которое требуется для вывода, однозначно соответствующего поплавковому или двойному значению.

Чтобы использовать пример 0.35 в ответе david99world, рассмотрите следующий код:

BigDecimal bd1 = new BigDecimal(0.35);

Number n = 0.35;
BigDecimal bd2 = new BigDecimal(n.toString());

System.out.println(bd1);
System.out.println(bd2);

Интуитивное ожидание может состоять в том, что два экземпляра BigDecimal идентичны, но вывод показывает, что они не являются:

0.34999999999999997779553950749686919152736663818359375
0.35

Первая строка - точное значение double, так как 0.35 невозможно точно представить. Вторая строка - 0,35, так как для представления отдельного значения не требуется более дробных цифр. Например. оператор 0.34999999999999997779553950749686919152736663818359375 == 0.35 будет оценивать до true.

На самом деле это не потеря точности при создании BigDecimal, неопределенность уже присутствует в вашем "исходном" значении. Проблема скорее в том, что дискретные значения можно использовать, например, значение float или double в качестве источника необязательно будет представлено точным эквивалентом в экземпляре BigDecimal.