Удалить ведущие нули после запятой в BigDecimal

У меня есть 2 BigDecimals, и я хочу удалить одинаковое количество ведущих нулей для обоих чисел, даже тех, которые находятся за запятой. Есть ли способ сделать это без дорогостоящего преобразования toString? Вот несколько примеров того, как я хочу, чтобы это выглядело:

0.0004 -> 0.4

за запятой было 3 нуля, поэтому я хочу удалить 3 нуля и на другом:

0.00003 -> 0.03


person Distjubo    schedule 04.09.2015    source источник
comment
Вы имеете в виду, что хотите умножить числа на степень десяти?   -  person Marko Topolnik    schedule 04.09.2015
comment
@MarkoTopolnik да, но оба числа не должны быть больше 10. И я должен определить количество нулей в обоих числах   -  person Distjubo    schedule 04.09.2015


Ответы (4)


Возьмите большее число, примените movePointRight итеративно, сравнивая с 0.1, чтобы знать, когда остановиться. Затем переместите точку вправо на ту же величину на меньшее число.

person Marko Topolnik    schedule 04.09.2015

Я думаю, вы можете использовать метод movePointRight. Ниже приведен вывод javarepl.

java> BigDecimal a = new BigDecimal("0.0004");
java.math.BigDecimal a = 0.0004
java> a.movePointRight(3);
java.math.BigDecimal res2 = 0.4
java> BigDecimal b = new BigDecimal("0.00003");
java.math.BigDecimal b = 0.00003
java> b.movePointRight(3);
java.math.BigDecimal res4 = 0.03
person ntalbs    schedule 04.09.2015

Вот быстрое предложение

    BigDecimal a = new BigDecimal("0.0004");
    BigDecimal b = new BigDecimal("10000.000003");
    final BigInteger aInteger = a.abs().toBigInteger();
    final BigDecimal aDecimal = a.subtract(new BigDecimal(aInteger));
    final BigInteger bInteger = b.abs().toBigInteger();
    final BigDecimal bDecimal = b.subtract(new BigDecimal(bInteger));
    final BigDecimal x = aDecimal.compareTo(bDecimal) > 1 ? b : a;
    BigDecimal DECIMAL = x.subtract(new BigDecimal(x.abs().toBigInteger()));
    int count = 0;
    final BigDecimal one = new BigDecimal(1);
    while (DECIMAL.multiply(new BigDecimal(10)).compareTo(one) < 0) {
        count++;
        DECIMAL = DECIMAL.multiply(new BigDecimal(10));
    }
    a = new BigDecimal(aInteger).add(aDecimal.movePointRight(count));
    b = new BigDecimal(bInteger).add(bDecimal.movePointRight(count));
    System.out.println("a =" + a + "  b = " + b);

Ты можешь лучше

person Aguid    schedule 04.09.2015

Попробуйте DecimalFormat, проверьте URL-адрес http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html

Поиграйте с BigDecimal, как показано ниже.

DecimalFormat nf = new DecimalFormat("##,###.###");
nf.setParseBigDecimal(true);
BigDecimal bd = ((BigDecimal) nf.parse("10,233.907")).setScale(3,BigDecimal.ROUND_HALF_UP);
person Balaji Kannan    schedule 04.09.2015
comment
Спасибо, но я действительно не хочу преобразовывать их в строку, потому что это занимает некоторое время с этими большими числами. (У меня уже есть 2 BigDecimals) В любом случае спасибо. - person Distjubo; 04.09.2015