Java 减去bigDecimal数字会产生0的精度?

Java 减去bigDecimal数字会产生0的精度?,java,bigdecimal,Java,Bigdecimal,我正在做两个大的十进制数的减法。使用减法时,它们都具有非零精度,但结果的精度为0 据我所知,精度为0的大十进制数是不可能的。即使0的精度也为1 精度是未标度值中的位数。例如,对于数字123.45,返回的精度为5 另见 所涉领域: BigDecimal test = (centerHP.getReal().subtract(inverseScale)); centerHP.getReal返回从此行创建的bigDecimal new BigDecimal(Double.toString(cente

我正在做两个大的十进制数的减法。使用减法时,它们都具有非零精度,但结果的精度为0

据我所知,精度为0的大十进制数是不可能的。即使0的精度也为1

精度是未标度值中的位数。例如,对于数字123.45,返回的精度为5

另见

所涉领域:

BigDecimal test = (centerHP.getReal().subtract(inverseScale));
centerHP.getReal返回从此行创建的bigDecimal

new BigDecimal(Double.toString(center.getReal()))
对于context center.real=-0.79,这是一个双精度值

所以它是有效的

new BigDecimal("-0.79")
反比标度仅为1

double scale = 1;

BigDecimal inverseScale = (BigDecimal.ONE.divide(new BigDecimal(Double.toString(scale))));
我希望测试是一个值为-1.79的大十进制,int表示应该是-179,精度为3,刻度为2。但是,在BigDecimal类中减法方法中的加法操作之后,我的值如下所示:

测试等于:


请注意,所有其他值都是正确的,只有精度似乎是错误的。

在该字段的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;
方法精度惰性地决定精度

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;
}

您是否尝试对有问题的对象调用precision方法?我认为对于调试器中显示的私有字段的值没有任何保证;测试精度设置为3。仍然好奇为什么精度未知。@TheChosenHero:确定精度需要时间。因此,这只在请求时进行,而不是在创建BigDecimal时。在请求之前,内部数据成员被设置为0以指示:仍然未知。只有在查询精度后,才确定该值并将其存储在内部成员中。@TheChosenHero延迟执行的任何操作都是为了保存计算。此字段可能永远不需要,因此不提前计算它可以节省时间。BTW String.hashCode做同样的事情,并且只在需要时计算。在设置之前,它的默认值是0,这意味着它是字符串哈希,哈希代码为0,它将每隔一天重新计算一次time@PeterLawreyLawrey好吧,也许有些计算不需要精度。我必须更多地使用BigDecimal类,并理解如何最好地使用它。谢谢你的帮助!