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
类型的值是否为零:
acStrayCurrent
和dcStrayCurrent
转换为BigDecimal
类型。如果它们是null
,则赋值为BigDecimal.ZERO
。BigDecimal
对象,将其初始化为表示零的BigDecimal
。可以使用new BigDecimal("0.00")
来表示精度和小数位都为0的零值。compareTo()
方法将acStrayCurrent
和dcStrayCurrent
与表示零的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
类型的值是否为零。如果acStrayCurrent
和dcStrayCurrent
都不为零,则进入if语句内部。否则,不进入if语句内部。