pg数据库numeric类型数据如何判定值为零


                    Object acStrayCurrent = stringObjectMap.get("acStrayCurrent");
                    Object dcStrayCurrent = stringObjectMap.get("dcStrayCurrent");
                    if ((acStrayCurrent != null && !acStrayCurrent.equals(BigDecimal.ZERO))
                            || (dcStrayCurrent != null && !dcStrayCurrent.equals(BigDecimal.ZERO))) {
                        // -------
                    }

为什么上面这段代码不能判定pg数据库中对应的numeric(10,2)的值为0.00的情况?
##现在需要判定当acStrayCurrent 或 dcStrayCurrent 任意一个不等于空且不等于0.00(numeric(10, 2))才能进入if内部该如何判定,目前来看好像acStrayCurrent.equals(BigDecimal.ZERO)不能正确判定0.00

你遇到的问题可能是由于BigDecimal.ZERO实际上是一个BigDecimal对象,而你的stringObjectMap似乎返回一个Object类型。当你从stringObjectMap获取一个Object并尝试将其与BigDecimal.ZERO进行比较时,Java可能无法正确解析这个比较。

如果你确定stringObjectMap中的值是BigDecimal类型,你可以尝试将获取的对象转换为BigDecimal,然后再与BigDecimal.ZERO进行比较。以下是修改后的代码:

Object acStrayCurrent = stringObjectMap.get("acStrayCurrent");
Object dcStrayCurrent = stringObjectMap.get("dcStrayCurrent");

if (acStrayCurrent != null && acStrayCurrent instanceof BigDecimal && !((BigDecimal) acStrayCurrent).equals(BigDecimal.ZERO)) {
    // -------
}
if (dcStrayCurrent != null && dcStrayCurrent instanceof BigDecimal && !((BigDecimal) dcStrayCurrent).equals(BigDecimal.ZERO)) {
    // -------
}

上述代码首先检查获取的对象是否为null,然后检查它是否是BigDecimal的实例,然后再将其转换为BigDecimal并与ZERO进行比较。如果任何一个条件为真,则执行相应的操作。

这样修改之后,应该可以解决你的问题。如果仍然存在问题,可能需要进一步检查你的数据库和映射代码,以确保数据的类型和你在Java代码中使用的类型相匹配。

【以下回答由 GPT 生成】

问题原因是BigDecimal.equals()方法不能准确判断numeric类型数据是否为零。这是因为对于numeric类型的数据,它们的精度和小数位是被保存的,而BigDecimal.equals()方法默认会比较精度和小数位。所以,即使数值相同,但精度和小数位不同,equals()方法也会返回false。所以,为了正确判断numeric类型数据是否为零,我们需要用其他的方法。

以下是一种解决方案,用于正确判断pg数据库中numeric类型的值是否为零:

  1. 首先,将acStrayCurrentdcStrayCurrent转换为BigDecimal类型。如果它们是null,则赋值为BigDecimal.ZERO
  2. 接下来,创建一个BigDecimal对象,将其初始化为表示零的BigDecimal。可以使用new BigDecimal("0.00")来表示精度和小数位都为0的零值。
  3. 最后,使用compareTo()方法将acStrayCurrentdcStrayCurrent与表示零的BigDecimal进行比较。如果它们大于零或小于零,则说明不等于零,进入if语句内部。如果它们等于零,则说明为零,不进入if语句内部。

下面是修改后的代码示例:

Object acStrayCurrent = stringObjectMap.get("acStrayCurrent");
Object dcStrayCurrent = stringObjectMap.get("dcStrayCurrent");

BigDecimal acStrayCurrentDecimal = (acStrayCurrent != null) ? new BigDecimal(acStrayCurrent.toString()) : BigDecimal.ZERO;
BigDecimal dcStrayCurrentDecimal = (dcStrayCurrent != null) ? new BigDecimal(dcStrayCurrent.toString()) : BigDecimal.ZERO;

BigDecimal zero = new BigDecimal("0.00");

if (acStrayCurrentDecimal.compareTo(zero) != 0 || dcStrayCurrentDecimal.compareTo(zero) != 0) {
    // ...
}

请注意,代码中的类型转换和BigDecimal的初始化可能会引发NumberFormatException异常,你需要在适当的地方进行异常处理。

这样修改后的代码可以正确判断pg数据库中numeric类型的值是否为零。如果acStrayCurrentdcStrayCurrent都不为零,则进入if语句内部。否则,不进入if语句内部。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^