`
mfan
  • 浏览: 340851 次
  • 性别: 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>
这样就不需要对空值进行判断了。

分享到:
评论

相关推荐

    红包算法 Java

    这里使用了`BigDecimal`类型来处理金额,主要是因为浮点数在进行数学运算时可能会出现精度问题,而`BigDecimal`能够提供更高精度的计算。 ##### 3.2 随机红包工具类 接下来是红包算法的核心部分——`...

    红包随机算法实现

    在Java中,可以使用`java.util.Random`类来生成随机数,`ArrayList`来存储红包金额,`BigDecimal`处理金额的精确计算。具体的代码实现会涉及这些类和方法的使用。 通过以上步骤,我们可以创建一个公平的红包随机...

    人民币小写转大写JAVA程序.doc

    在JAVA中,BigDecimal类型主要用于精度计算,特别是在金融领域中,BigDecimal类型可以确保金额计算的准确性。在本程序中,使用BigDecimal类型来处理金额,以确保计算的准确性。 知识点2:中文数字与单位的存储 在...

    微信随机生成红包金额算法java版

    微信随机生成红包金额算法在Java中的实现主要是为了模拟微信红包发放过程中的随机金额分配逻辑。以下将详细解析这两种不同的实现方式: 1. **WxAlgorithm类的实现**: 这个实现首先定义了一个`wxAlgorithm`方法,...

    java贷款计算器

    总的来说,"java贷款计算器"项目涉及到的核心技术包括Java面向对象编程、`BigDecimal`类的使用、贷款计算算法的实现以及可能的用户交互设计。通过这个项目,开发者不仅可以提升自己的编程技能,还能深入了解金融领域...

    java 模仿拼多多红包递减算法的实现

    3. BigDecimal 类:BigDecimal 是 Java 语言中的一种数据类型,用于表示任意精度的十进制数。在本文中,作者使用了 BigDecimal 类来表示红包金额。 4. 递减机制:递减机制是指红包金额逐步减少的过程。在本文中,...

    Java解惑中文版(带索引)

    在进行货币计算时,通常需要确保结果的准确性,特别是在涉及到金额的交易系统中。然而,由于二进制浮点数(如`double`)的固有限制,直接使用这些数据类型来进行货币计算可能会导致不精确的结果。 **示例代码**: ``...

    购车贷款程序设计JAVA

    总的来说,"购车贷款程序设计JAVA"涵盖了JAVA编程基础、面向对象设计、金融计算算法、GUI编程和错误处理等多个方面,是学习和实践JAVA技术的好项目。通过这个项目,开发者不仅可以提升编程技能,还能对贷款业务有...

    JAVA实现简单抢红包算法(模拟真实抢红包)

    6. **列表存储与输出**:使用`ArrayList&lt;BigDecimal&gt;`存储每个人的红包金额,便于后续的计算和输出。在`main`方法中,遍历这个列表并输出每个人的红包金额,以及最后计算出的总金额。 7. **最后一个红包**:最后一...

    java中每月等额与先息后本计算

    import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; public class CPMUtils { // 等额本息每月还款总额计算 public static BigDecimal monthlyRepayment(BigDecimal principal, ...

    java解惑

    在尝试计算找零金额时,使用`double`类型进行计算可能会导致不准确的结果,因为并非所有小数都能精确表示为二进制浮点数。在例子中,`2.00 - 1.10`的结果看似应该是0.9,但实际上由于浮点数的精度限制,输出了`0....

    java处理大数

    对于超过基本数据类型(如`int`、`long`等)所能表示的最大值的大数,Java 提供了`BigInteger`和`BigDecimal`两个类来进行精确的大数运算。本文将重点介绍如何利用`BigInteger`类处理大数,并通过一个具体的示例程序...

    java课程设计题目..doc

    18. **模拟科学计算器**:数学运算,函数实现,GUI事件处理,可能用到BigDecimal进行高精度计算。 19. **模拟画图**:图形绘制,鼠标事件处理,GUI交互,可能用到Java的Graphics2D API。 在进行这些课程设计时,...

    Java使用策略模式解决商场促销商品问题示例

    import java.math.BigDecimal; import com.demo.strategy.IStrategy; / * 上下文环境 * * @author */ public class Context { // 当前策略 private IStrategy strategy; // 设置当前策略 public void ...

    货币换算

    本项目"货币换算"很可能是一个用Java编程语言实现的程序,它允许用户将一种货币的金额转换为另一种货币。在深入探讨这个主题之前,我们需要了解一些基本概念。 首先,货币换算涉及汇率(Exchange Rate),这是两种...

    SalesTax

    通过缓存常见税率、使用高效算法或并行计算(如Java并发库提供的工具)可以提升性能。 8. **日志和审计**:为了合规性和审计需求,保存每一次交易的详细记录,包括商品信息、税率、税费等,可以使用Java的日志框架...

Global site tag (gtag.js) - Google Analytics