BigDecimal在实际项目的应用及遇到的问题
我们都知道,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在实际项目的应用及遇到的问题的更多相关文章
- 项目中BigDecimal与Double使用场景
金额要用BigDecimal 金额计算不能用doube!!!! 金额计算必须用BigDecimal,下面对比一下用double 跟BigDecimal的区别.先看一个小例子: 请看题: 示例1 问, ...
- J2EE项目开发中常用到的公共方法
在项目IDCM中涉及到多种工单,包括有:服务器|网络设备上下架工单.服务器|网络设备重启工单.服务器光纤网线更换工单.网络设备撤线布线工单.服务器|网络设备替换工单.服务器|网络设备RMA工单.通用原 ...
- BigDecimal 详细解析
参加工作之后发现公司项目的数据库有关数值的字段类型,很少是之前常用的float和double, 而是一个没有接触过的decimal,在Java中表示的类型为BigDecimal, 而在业务中常常有关B ...
- 基于mybatis-generator-core 1.3.5项目的修订版以及源码剖析
项目简单说明 mybatis-generator,是根据数据库表.字段反向生成实体类等代码文件.我在国庆时候,没事剖析了mybatis-generator-core源码,写了相当详细的中文注释,可以去 ...
- Java项目JUnit简单使用
前面自己写了一个计算器,准备用在项目里 http://www.cnblogs.com/blog5277/p/5707304.html 由于项目是用户计算跟钱有关的,所以这可不敢出BUG 于是就用了JU ...
- SSH项目(1)
1.新建项目,添加jar包 tomcat jsp struts.hibernate.spring 2.配置 web.xml <?xml version="1.0" encod ...
- 简单BigDecimal运算精度
项目中遇到了数值运算,如网上所写的,一般有这几个方法: /** * 提供精确的加法运算. * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ publ ...
- long和BigDecimal引发的管理思考
关于long.double.BigDecimal在效率.可用性.灵活性等等方面的技术性讨论和测试其实在网上已经很多了,本文也不是打算讨论他们的实现的,其实笔者也曾在很长的职业生涯周期中一度拘泥于此.但 ...
- Java中正则表达式及其常用类Math、Calendar、Date、BigDecimal、BigInterger、System、Rondom的使用
1:正则表达式(理解) (1)就是符合一定规则的字符串 (2)常见规则 A:字符 x 字符 x.举例:'a'表示字符a \\ 反斜线字符. \n 新行(换行)符 ('\u000A') \r 回车符 ( ...
随机推荐
- linux共享库
linux共享库 linux中共享库一般以.so.x.y.z 命名,其中x,y,z分别为主版本号.次版本号.发布版本号.同一个库,主版本号不同则相互不兼容:主版本相同,次版本号高的库比次版本号低的库有 ...
- ASP.NET 配置KindEditor文本编辑器
ASP.NET 配置KindEditor文本编辑器 跟着这篇博客做了两个小时,只搞出了下面这么个东西. 时间浪费在了原博客里这样的一句话:将kindeditor/asp.net/bin/LitJSON ...
- c-free
- 6/14 Sprint2 看板和燃尽图
中间部分还需要改进 小组评分:(团队总分为80) 团队成员: 101丘娟同学:21 107杨晓霞同学:18 108周诗琦同学:22 124陈程同 ...
- HR函数学习03——维护信息类型1008
REPORT ZLYHR01. DATA:TP1008 TYPE TABLE OF P1008, SP1008 TYPE P1008. SP1008-PLVAR = '. SP1008-OTYPE = ...
- UDK:AdventureKit 攀爬系统
[目标] AdventureKit攀爬系统 [思路] [步骤] 1 拷贝 2 设置config,UDKGame\Config\DefaultEngine.ini 添加包 [UnrealEd.Edito ...
- iOS开发UI篇—IOS开发中Xcode的一些使用技巧
iOS开发UI篇—IOS开发中Xcode的一些使用技巧 一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n 新建项目 cmd + n 新建文 ...
- ubuntu 14.04 下找不到命令,路径出错
在安装一些东西时,可能操作上不小心把路径覆盖或打错,造成一些基本命令如ls mkdir等无法使用,就会出现以下提示错误. 错误: 由于/usr/bin 不在PATH 环境变量中,故无法找到该命令 根本 ...
- uboot make xxx_config与make的过程分析
一直很想捋清楚make xxx_config,make 的执行过程. 在uboot的makefile中有这样的话: %_config::unconfig @$(MKCONFIG) -A $(@:_co ...
- Android中Service的使用
我个人的理解是:我们平时使用的android系统的app的后台应用,就是这个原理 可以利用Service实现程序在后台运行,依照这个原理,可以通过Service来实现关键代码的运行与实现. <一 ...