在JSF页面上进行BigDecimal算术运算

4
例如,下面是一个 JSF 管理的 bean。
@ManagedBean
@ViewScoped
public final class Bean implements Serializable {

    private BigDecimal price; //Getter only.
    private BigDecimal currencyRate; //Getter only.
    private static final long serialVersionUID = 1L;

    @PostConstruct
    private void init() {
        price=new BigDecimal(5678);
        currencyRate=new BigDecimal(0.016622);
    }
}
pricecurrencyRate的乘积可以显示在<h:outputText>中。
<h:outputText value="#{bean.price * bean.currencyRate}"/>

这个乘法运算得到的是BigDecimal还是只是一个double值?


换句话说,这是否等同于以下内容?

<h:outputText value="#{bean.price.multiply(bean.currencyRate)}"/>

在这两种情况下,都会显示94.3797160000000077070825277303356415359303355216979980468750


如果有一个转换器来显示指定位数的小数位,例如两位,会怎样呢?

<h:outputText value="#{bean.price * bean.currencyRate}"
              converter="#{bigDecimalConverter}"/>

无论如何,我希望这些表达式的结果都是 BigDecimal


BigDecimal肯定没问题,但你自己测试一下也很容易。 - user207421
我不知道如何在JSF页面上测试类型。两种情况的结果都相同 - 94.3797160000000077070825277303356415359303355216979980468750 - Tiny
你刚刚测试并验证了它。如果是双精度,你就不会得到那么高的精度。 - user207421
1个回答

7

来自El 3.0规范pdf(第13页-第1.7.1节):

算术运算符的计算方法在以下章节中进行描述。A和B是子表达式的计算结果。
1.7.1 二元运算符 - A {+,-,*} B
- 如果A和B都为null,则返回(Long)0。 - 如果A或B是BigDecimal类型,则将两者转换为BigDecimal类型,然后: - 如果运算符是+,则返回A.add(B)。 - 如果运算符是-,则返回A.subtract(B)。 - 如果运算符是*,则返回A.multiply(B)。 - 如果A或B是Float、Double或包含"."、"e"或"E"的String类型,则: - 如果A或B是BigInteger类型,则将A和B都转换为BigDecimal类型并应用运算符。 - 否则,将A和B都转换为Double类型并应用运算符。 - 如果A或B是BigInteger类型,则将两者都转换为BigInteger类型,然后: - 如果运算符是+,则返回A.add(B)。 - 如果运算符是-,则返回A.subtract(B)。 - 如果运算符是*,则返回A.multiply(B)。 - 否则,将A和B都转换为Long类型并应用运算符。 - 如果运算符导致异常,则出错。
因此,在 <h:outputText> 中指定的 EL 表达式 #{bean.price * bean.currencyRate} 是正确的。
<h:outputText value="#{bean.price * bean.currencyRate}"/>

由于相应后端bean中的bean.pricebean.currencyRate都是java.math.BigDecimal类型,因此其计算结果被转换为java.math.BigDecimal类型——内部执行bean.price.multiply(bean.currencyRate)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接