JSF页面上的BigDecimal算法

Tin*_*iny 3 jsf bigdecimal jsf-2.2

例如,下面给出了一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

乘法pricecurrencyRate可以显示<h:outputText>.

<h:outputText value="#{bean.price * bean.currencyRate}"/>
Run Code Online (Sandbox Code Playgroud)

这个乘法产量BigDecimal或它只是一个double值吗?


换句话说,这相当于以下几点吗?

<h:outputText value="#{bean.price.multiply(bean.currencyRate)}"/>
Run Code Online (Sandbox Code Playgroud)

它显示94.3797160000000077070825277303356415359303355216979980468750在两种情况下.


如果有一个转换器显示指定的十进制数字,例如,如下所示,那该怎么办?

<h:outputText value="#{bean.price * bean.currencyRate}"
              converter="#{bigDecimalConverter}"/>
Run Code Online (Sandbox Code Playgroud)

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

Tin*_*iny 6

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

算术运算符的评估将在以下部分中介绍.A和B是子表达式的评估.

1.7.1二元运算符 - A {+, - ,*} B.

  • 如果是A和B null,则返回(Long)0
  • 如果A或B是a BigDecimal,则强制执行以下操作BigDecimal:
    • 如果运算符为+,则返回 A.add(B)
    • 如果操作符是 - ,则返回 A.subtract(B)
    • 如果运算符为*,则返回 A.multiply(B)
  • 如果A或B是a Float,DoubleString包含.,e或E:
    • 如果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并应用运算符
  • 如果运算符导致异常,则出错

因此,是的EL表达式,#{bean.price * bean.currencyRate}"<h:outputText>,

<h:outputText value="#{bean.price * bean.currencyRate}"/>
Run Code Online (Sandbox Code Playgroud)

被评估为a java.math.BigDecimal,因为两者bean.pricebean.currencyRate相应的支持bean都是类型的java.math.BigDecimal- bean.price.multiply(bean.currencyRate)是在内部执行的.