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

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 в строке

4b9b3361

Ответ 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);

Одним из столпов ориентированного объектного программирования (ООП) является "инкапсуляция", этот столп также говорит, что объект должен иметь дело со своими собственными операциями, например, так: