我们都知道,java中对大小数,高精度的计算都会用到BigDecimal.但是在实际应用中,运用BigDecimal还是会遇到一些问题.下面说一下我在项目中怎么样BigDecimal和遇到的一些问题.

1. 对商品的价格进行格式化,比如所有商品的价格保留两位小数

/**
*
* @param bd 商品的价格
* @param num 保留几位小数,如num = 2
* @return
*/
public static String formatPrice(BigDecimal bd,int num){
if(bd == null || num < 0){
return null;
}
bd = bd.setScale(num, BigDecimal.ROUND_HALF_UP);
return bd + "";
}

  

其中BigDecimal.ROUND_HALF_UP表示采用"四舍五入"的模式处理价格

2. 将商品的价格由元转为分,便于前端分隔展现

/**
* 元转换为分
* @param bd 商品的价格
* @return
*/
public static String yuanToCent(BigDecimal bd){
if(bd == null){
return null;
}
bd = bd.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_EVEN);
return bd + "";
}

  

其中setScale(0, BigDecimal.ROUND_HALF_EVEN)表示采用"四舍五入"的模式处理价格,并且结果不保留小数.

3. 获取缓存命中率

/**
* 缓存命中率
* @return
*/
public static String getHitRate(){
BigDecimal a = new BigDecimal(cacheCount.longValue()*100);
BigDecimal b = new BigDecimal(sumCount.longValue());
if(sumCount.longValue() > 0){
return "%" + (a.divide(b, 2, BigDecimal.ROUND_HALF_EVEN));
}
return "0";
}

  

4. BigDecimal中对于等于"0"的判断

在 BigDecimal中,new BigDecimal("0")与new BigDecimal("0.0"),new BigDecimal(0)与new BigDecimal("0.0")都是不等的.但是本质上,它们都是"0".怎么对是否等于"0"进行判断?将BigDecimal类型的值转换为double类型进行比较或通过上面的方法yuanToCent转换一下比较就能解决这个问题.

5.  用BigDecimal进行除法计算时抛出java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result异常.

比如用new BigDecimal(30).divide(new BigDecimal(7))就会抛这个异常,异常原因:BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛这个异常.

解决办法:给divide设置精确的小数点位数或"舍入"模式,如

new BigDecimal(30).divide(new             BigDecimal(7),BigDecimal.ROUND_HALF_UP).setScale(2,BigDecimal.ROUND_HALF_UP)或

new BigDecimal(30).divide(new BigDecimal(7),2,BigDecimal.ROUND_HALF_UP)

建议采用第二种方式,因为第二种方式的结果精度更高

另外,要注意BigDecimal跟String一样,是不可改变的,比如BigDecimal对象执行setScale(), add()等操作都会返回一个新的BigDecimal.

BigDecimal在实际项目的应用及遇到的问题的更多相关文章

  1. 项目中BigDecimal与Double使用场景

    金额要用BigDecimal 金额计算不能用doube!!!! 金额计算必须用BigDecimal,下面对比一下用double 跟BigDecimal的区别.先看一个小例子: 请看题: 示例1 问, ...

  2. J2EE项目开发中常用到的公共方法

    在项目IDCM中涉及到多种工单,包括有:服务器|网络设备上下架工单.服务器|网络设备重启工单.服务器光纤网线更换工单.网络设备撤线布线工单.服务器|网络设备替换工单.服务器|网络设备RMA工单.通用原 ...

  3. BigDecimal 详细解析

    参加工作之后发现公司项目的数据库有关数值的字段类型,很少是之前常用的float和double, 而是一个没有接触过的decimal,在Java中表示的类型为BigDecimal, 而在业务中常常有关B ...

  4. 基于mybatis-generator-core 1.3.5项目的修订版以及源码剖析

    项目简单说明 mybatis-generator,是根据数据库表.字段反向生成实体类等代码文件.我在国庆时候,没事剖析了mybatis-generator-core源码,写了相当详细的中文注释,可以去 ...

  5. Java项目JUnit简单使用

    前面自己写了一个计算器,准备用在项目里 http://www.cnblogs.com/blog5277/p/5707304.html 由于项目是用户计算跟钱有关的,所以这可不敢出BUG 于是就用了JU ...

  6. SSH项目(1)

    1.新建项目,添加jar包 tomcat jsp struts.hibernate.spring 2.配置 web.xml <?xml version="1.0" encod ...

  7. 简单BigDecimal运算精度

    项目中遇到了数值运算,如网上所写的,一般有这几个方法: /** * 提供精确的加法运算. * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ publ ...

  8. long和BigDecimal引发的管理思考

    关于long.double.BigDecimal在效率.可用性.灵活性等等方面的技术性讨论和测试其实在网上已经很多了,本文也不是打算讨论他们的实现的,其实笔者也曾在很长的职业生涯周期中一度拘泥于此.但 ...

  9. Java中正则表达式及其常用类Math、Calendar、Date、BigDecimal、BigInterger、System、Rondom的使用

    1:正则表达式(理解) (1)就是符合一定规则的字符串 (2)常见规则 A:字符 x 字符 x.举例:'a'表示字符a \\ 反斜线字符. \n 新行(换行)符 ('\u000A') \r 回车符 ( ...

随机推荐

  1. 与Status Bar和Navigation Bar相关的一些东西

    Android Navigation Bar Status Bar   与StatusBar和NavigationBar相关的东西有两种,一是控制它们的显示与隐藏,二是控制它们的透明与否及背景. 在2 ...

  2. google protobuf ios开发使用

    简介: protobuf 即 google protocol buffer 是一种数据封装格式协议: 比如其他经常用的xml,json等格式:protobuf的优势是效率高,同样的一份数据使用prot ...

  3. python之map、filter、reduce、lambda函数 转

    python之map.filter.reduce.lambda函数  转  http://www.cnblogs.com/kaituorensheng/p/5300340.html 阅读目录 map ...

  4. html知识——表单

    1.表单标记:<form>内容</form> 属性:     name(表单名称) 必须写!!!  method(传送数据方式): get--将表单的内容附加在URL地址的后面 ...

  5. a标签中的点击事件

    我们常用的在a标签中有点击事件:1. a href="javascript:js_method();" 这 是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问 ...

  6. MVC部署到iis

    程序域功能->打开或关闭->iis信息服务及.net framework下的两个要勾选 1. 发布程序,以文件系统file system 的形式,发布到一个文件夹里    自定义-> ...

  7. MyBatis关联查询 (association) 时遇到的某些问题/mybatis映射

    先说下问题产生的背景: 最近在做一个用到MyBatis的项目,其中有个业务涉及到关联查询,我是将两个查询分开来写的,即嵌套查询,个人感觉这样更方便重用: 关联的查询使用到了动态sql,在执行查询时就出 ...

  8. WPF笔记

    1.使用TypeConvert类将XAML标签的Attribute与对象的Propety进行映射 由于XAML所有属性=属性值,其中属性值必须是字符串,当属性值不是字符串时需要添加将该属性值转换成字符 ...

  9. iOS开发UI篇—使用storyboard创建导航控制器以及控制器的生命周期

    iOS开发UI篇—使用storyboard创建导航控制器以及控制器的生命周期 一.基本过程 新建一个项目,系统默认的主控制器继承自UIViewController,把主控制器两个文件删掉. 在stor ...

  10. GCC选项 –I,-l,-L

    -I:指定第一个寻找头文件的目录 -L:指定第一个寻找库文件的目录 -l:表示在库文件目录中寻找指定的动态库文件 例: gcc –o hello hello.c –I /home/hello/incl ...