例如,下面给出了一个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);
}
}
price
和currencyRate
的乘法可以显示在<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
。
答案 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的
Float
,Double
或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
并应用运算符- 如果运算符导致异常,则错误
因此,是#{bean.price * bean.currencyRate}"
中指定的EL表达式<h:outputText>
,
<h:outputText value="#{bean.price * bean.currencyRate}"/>
评估为java.math.BigDecimal
,因为相应支持bean中的bean.price
和bean.currencyRate
都是java.math.BigDecimal
类型 - bean.price.multiply(bean.currencyRate)
是在内部执行的。< / p>