`
mfan
  • 浏览: 338839 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

Java对金额算法的BigDecimal类型

    博客分类:
  • SSH
阅读更多
   在Java中,使用float可以表示浮点数这是个常识,但是float的精度是有问题的,如果涉及金额,那么一般来说就不能用float类型,而是使用BigDecimal,这是个需要掌握的准则。

Commodities,java(商品类)
public class Commodities{

//商品ID
private int commoditiesid;
//商品名称
private String commoditiesname;
//商品类型
private String commoditiestype;
public int getCommoditiesid() {
return commoditiesid;
}
public void setCommoditiesid(int commoditiesid) {
this.commoditiesid = commoditiesid;
}
public String getCommoditiesname() {
return commoditiesname;
}
public void setCommoditiesname(String commoditiesname) {
this.commoditiesname = commoditiesname;
}
public String getCommoditiestype() {
return commoditiestype;
}
public void setCommoditiestype(String commoditiestype) {
this.commoditiestype = commoditiestype;
}
}

Commoditiesorder.java(订单类)

public class Commoditiesorder{
//订单ID
private int orderid;
//商品ID
private int commoditiesid;
//商品数量
private int volume;
//商品金额
private float amount;
public int getOrderid() {
return orderid;
}
public void setOrderid(int orderid) {
this.orderid = orderid;
}
public int getCommoditiesid() {
return commoditiesid;
}
public void setCommoditiesid(int commoditiesid) {
this.commoditiesid = commoditiesid;
}
public int getVolume() {
return volume;
}
public void setVolume(int volume) {
this.volume = volume;
}
public float getAmount() {
return amount;
}
public void setAmount(float amount) {
this.amount = amount;
}
}

以上是两个实体entity,从表示层(JSP)到模型层(Action)的数据传递通过CommoditiesorderAction来实现
CommoditiesorderAction.java类
public class CommoditiesorderAction extends ActionSupport{
//订单ID
private int orderid;
//商品ID
private int commoditiesid;
//商品数量
private int volume;
//商品金额
private float amount;
//Commoditiesorder实例
private Commoditiesorder commoditiesorder

public int getOrderid() {
return orderid;
}
public void setOrderid(int orderid) {
this.orderid = orderid;
}
public int getCommoditiesid() {
return commoditiesid;
}
public void setCommoditiesid(int commoditiesid) {
this.commoditiesid = commoditiesid;
}
public int getVolume() {
return volume;
}
public void setVolume(int volume) {
this.volume = volume;
}
public float getAmount() {
return amount;
}
public void setAmount(float amount) {
this.amount = amount;
}
public Commoditiesorder getCommoditiesorder() {
return commoditiesorder;
}
public void setCommoditiesorder(Commoditiesorder commoditiesorder) {
this.commoditiesorder = commoditiesorder;
}
public String execute()throws Exception{
this.commoditiesorder.setOrderid(this.getOrderid());
this.commoditiesorder.setVolume(this.getVolume());
this.commoditiesorder.setAmount(this.getAmount());
return "success";
}
}
在CommoditiesorderAction.java类中,
this.commoditiesorder.setAmount(this.getAmount())
amount使用了float类型,但是由于amount的含义是金额,那么就设涉及到主体业务中金额的算法,因此需要对amount进行类型转换。

解决方案:将Action中的amount类型改为String,在与Commoditiesorder.java交换值时进行处理
//商品金额
private String amount;
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
        }
然后在Action中处理String到BigDecimal类型的转换

        //空值处理
if(this.getAmount().equals("")){
this.commoditiesorder.setAmount(null);
}else{
this.commoditiesorder.setAmount(new BigDecimal(this.getAmount()));
}
需要注意的是BigDecimal不支持空值实例化,故要判断空值。另外可以利用Struts提供的
将“空”值转换为null的小技巧,只需在web.xml中设置
<init-param>
     <param-name>convertNull</param-name>
     <param-value>convertNull</param-value>
</init-param>
这样就不需要对空值进行判断了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics