JSF页面上的BigDecimal算法

时间:2014-06-24 19:29:35

标签: 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);
    }
}

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

1 个答案:

答案 0 :(得分:6)

El 3.0 spec 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是包含。,e或E的FloatDoubleString:      
        
    • 如果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并应用运算符
  •   
  • 如果运算符导致异常,则错误
  •   

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

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

评估为java.math.BigDecimal,因为相应支持bean中的bean.pricebean.currencyRate都是java.math.BigDecimal类型 - bean.price.multiply(bean.currencyRate)是在内部执行的。< / p>