Следующее не всегда ведет себя так, как вы ожидаете:
<c:if test="${someBigDecimal == 0}">
Если someBigDecimal имеет значение 0, но имеет масштаб, отличный от 0, операция == возвращает false. То есть он возвращает истину, когда someBigDecimal является новым BigDecimal («0»), и ложью, когда someBigDecimal является новым BigDecimal («0,00»).
Это является результатом спецификаций JSP 2.0, 2.1 и 2.2, в которых говорится:
Для <,>, <=,> =:
Если A или B - BigDecimal, приведите A и B к BigDecimal а также используйте возвращаемое значение A.compareTo (B).
For ==,! =:
Если A или B - BigDecimal, приведите A и B к BigDecimal, а затем:
- Если оператор ==, вернуть A.equals (B)
- Если оператор! =, return! A.equals (B)
Это означает, что операторы ==
и ! =
приводят к вызову .equals ()
, который сравнивает не только значения, но и масштаб BigDecimals. Другие операторы сравнения приводят к вызову метода .compareTo ()
, который сравнивает только значения.
Конечно, сработает следующее:
<c:if test="${not ((someBigDecimal < 0) or (someBigDecimal > 0))}">
Но это довольно уродливо, есть ли лучший способ сделать это?