Вычитание bigDecimal чисел дает точность 0? - PullRequest
1 голос
/ 15 апреля 2019

Я работаю с вычитанием двух больших десятичных чисел. Переходя к методу вычитания, они оба имеют ненулевую точность, но результат имеет точность = 0.

Насколько мне известно, большое десятичное число с точностью до 0 невозможно. Четный 0 имеет точность 1.

Точность - это количество цифр в немасштабированном значении. Например, для числа 123.45 возвращаемая точность равна 5.

(см. Также BigDecimal, точность и масштаб ).

Площадь, о которой идет речь:

BigDecimal test = (centerHP.getReal().subtract(inverseScale));

centerHP.getReal() возвращает bigDecimal, созданный из этой строки

new BigDecimal(Double.toString(center.getReal()))

и для контекста center.real = -0.79, который является двойным.

так эффективно

new BigDecimal("-0.79")

InverseScale это просто 1

double scale = 1;

BigDecimal inverseScale = (BigDecimal.ONE.divide(new BigDecimal(Double.toString(scale))));

Я ожидаю, что тест будет bigDecimal со значением -1,79, представление int должно быть -179, с точностью 3 и шкалой 2. Однако сразу после операции сложения в методе вычитания в BigDecimal класс, мои значения таковы:

right after addition

и тест равен:

test value

Обратите внимание, что все остальные значения верны, только точность кажется неправильной.

1 Ответ

3 голосов
/ 15 апреля 2019

В javadoc для этого поля 0 означает, что точность неизвестна.

/**
 * The number of decimal digits in this BigDecimal, or 0 if the
 * number of digits are not known (lookaside information).  If
 * nonzero, the value is guaranteed correct.  Use the precision()
 * method to obtain and set the value if it might be 0.  This
 * field is mutable until set nonzero.
 *
 * @since  1.5
 */
private transient int precision;

Метод precision() определяет точность лениво.

public int precision() {
    int result = precision;
    if (result == 0) {
        long s = intCompact;
        if (s != INFLATED)
            result = longDigitLength(s);
        else
            result = bigDigitLength(inflate());
        precision = result;
    }
    return result;
}
...