Я ищу лучший способ преобразования числа в BigDecimal.
Достаточно ли это?
Number number;
BigDecimal big = new BigDecimal(number.toString());
Можем ли мы потерять точность с помощью метода toString()
?
Я ищу лучший способ преобразования числа в BigDecimal.
Достаточно ли это?
Number number;
BigDecimal big = new BigDecimal(number.toString());
Можем ли мы потерять точность с помощью метода toString()
?
Это прекрасно, помните, что использование конструктора BigDecimal для объявления значения может быть опасным, если оно не относится к типу String. Рассмотрим ниже...
BigDecimal valDouble = new BigDecimal(0.35);
System.out.println(valDouble);
Это не будет печатать 0.35, это будет infact быть...
0.34999999999999997779553950749686919152736663818359375
Я бы сказал, что ваше решение, вероятно, является самым безопасным из-за этого.
Можно ли потерять точность с помощью метода 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.