BigDecimal для строки
У меня есть объект BigDecimal, и я хочу преобразовать его в строку.
Проблема в том, что мое значение получило фракцию, и я получаю огромное количество (по длине), и мне нужно только исходное число в строке, например:
для
BigDecimal bd = new BigDecimal(10.0001)
System.out.println(bd.toString());
System.out.println(bd.toPlainString());
вывод:
10.000099999999999766941982670687139034271240234375
10.000099999999999766941982670687139034271240234375
и мне нужно, чтобы значение out было точно числом 10.0001
в строке
Ответы
Ответ 1
Чтобы получить ровно 10.0001
, вам нужно использовать конструктор String или valueOf
(который строит BigDecimal на основе канонического представления double):
BigDecimal bd = new BigDecimal("10.0001");
System.out.println(bd.toString()); // prints 10.0001
//or alternatively
BigDecimal bd = BigDecimal.valueOf(10.0001);
System.out.println(bd.toString()); // prints 10.0001
Проблема с new BigDecimal(10.0001)
заключается в том, что аргумент равен double
, и бывает, что двойники не могут точно представлять 10.0001
. Таким образом, 10.0001
"преобразуется" в ближайший возможный double, который равен 10.000099999999999766941982670687139034271240234375
и показывает то, что показывает ваш BigDecimal
.
По этой причине редко бывает целесообразно использовать двойной конструктор.
Подробнее об этом можно прочитать здесь Перемещение десятичных знаков в двойное число
Ответ 2
Ваш BigDecimal
не содержит числа 10.0001
, потому что вы инициализировали его double
, а в double
не совсем число, которое, как вы думали, было. (В этом весь смысл BigDecimal
.)
Если вы используете вместо этого конструктор на основе строк:
BigDecimal bd = new BigDecimal("10.0001");
... тогда он на самом деле будет содержать ожидаемое вами число.
Ответ 3
Используя метод ниже, вы можете преобразовать java.math.BigDecimal в String.
BigDecimal bigDecimal = new BigDecimal("10.0001");
String bigDecimalString = String.valueOf(bigDecimal.doubleValue());
System.out.println("bigDecimal value in String: "+bigDecimalString);
Вывод:
bigDecimal значение в String: 10.0001
Ответ 4
Для лучшей поддержки разные локали используют этот способ:
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2);
df.setMinimumFractionDigits(0);
df.setGroupingUsed(false);
df.format(bigDecimal);
также вы можете настроить его:
DecimalFormat df = new DecimalFormat("###,###,###");
df.format(bigDecimal);
Ответ 5
// Convert BigDecimal number To String by using below method //
public static String RemoveTrailingZeros(BigDecimal tempDecimal)
{
tempDecimal = tempDecimal.stripTrailingZeros();
String tempString = tempDecimal.toPlainString();
return tempString;
}
// Recall RemoveTrailingZeros
BigDecimal output = new BigDecimal(0);
String str = RemoveTrailingZeros(output);
Ответ 6
BigDecimal не может быть двойным.
вы можете использовать номер Int.
если вы хотите отобразить точно собственный номер, вы можете использовать конструктор String BigDecimal.
вот так:
BigDecimal bd1 = new BigDecimal("10.0001");
теперь вы можете отобразить bd1 как 10.0001
Так просто.
УДАЧА.
Ответ 7
Чтобы архивировать необходимый результат с помощью двойного конструктора, вам нужно окружить BigDecimal, прежде чем преобразовать его в String, например.
new java.math.BigDecimal(10.0001).round(new java.math.MathContext(6, java.math.RoundingMode.HALF_UP)). toString()
напечатает "10.0001"
Ответ 8
Если вам просто нужно установить точность и округлить значение, правильный способ сделать это - использовать для этого собственный объект.
BigDecimal value = new BigDecimal("10.0001");
value = value.setScale(4, RoundingMode.HALF_UP);
System.out.println(value);
Одним из столпов ориентированного объектного программирования (ООП) является "инкапсуляция", этот столп также говорит, что объект должен иметь дело со своими собственными операциями, например, так: