BigDecimal在实际项目的应用及遇到的问题(转)

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

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

Java代码  

  1. /**
  2. *
  3. * @param bd  商品的价格
  4. * @param num 保留几位小数,如num = 2
  5. * @return
  6. */
  7. public static String formatPrice(BigDecimal bd,int num){
  8. if(bd == null || num < 0){
  9. return null;
  10. }
  11. bd = bd.setScale(num, BigDecimal.ROUND_HALF_UP);
  12. return bd + "";
  13. }

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

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

Java代码  

  1. /**
  2. * 元转换为分
  3. * @param bd 商品的价格
  4. * @return
  5. */
  6. public static String yuanToCent(BigDecimal bd){
  7. if(bd == null){
  8. return null;
  9. }
  10. bd = bd.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_EVEN);
  11. return bd + "";
  12. }

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

3. 获取缓存命中率

Java代码  

  1. /**
  2. * 缓存命中率
  3. * @return
  4. */
  5. public static String getHitRate(){
  6. BigDecimal a = new BigDecimal(cacheCount.longValue()*100);
  7. BigDecimal b = new BigDecimal(sumCount.longValue());
  8. if(sumCount.longValue() > 0){
  9. return "%" + (a.divide(b, 2, BigDecimal.ROUND_HALF_EVEN));
  10. }
  11. return "0";
  12. }

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.

原帖地址:http://blog.csdn.net/liuxuejin/article/details/8730621

时间: 2024-09-27 15:23:28

BigDecimal在实际项目的应用及遇到的问题(转)的相关文章

java发布项目后注意小点,以及对于金额在java中的处理

项目在发布之后,有时会进行一些小的地方的修改,特别是对于一些常量的修改,如定义的一些特殊账户,第三方的key值,当修改的时候,我之前就偷懒过,因为项目在服务器上面,访问速度也受到限制,替换整个项目很麻烦,所以就只是替换了个别的类.这样会导致一个很严重的问题就是,修改了之后并没有什么效果,因为对于public final static int....类似于这种常量在编译时,别的类的字节码中已经写上了常量,而不是这个常量的引用,所以只是单纯的替换一个类,编译这一个类是不对的,而要把所有的类全部都编译

long和BigDecimal引发的管理思考

关于long.double.BigDecimal在效率.可用性.灵活性等等方面的技术性讨论和测试其实在网上已经很多了,本文也不是打算讨论他们的实现的,其实笔者也曾在很长的职业生涯周期中一度拘泥于此.但是渐渐的,已经对此没有那么的一根筋在乎了,至少从整个决策思路而言. 在涉及到金额或金融的计算中,有些时候为了显示或者严格准确性的要求,很多初级开发会毫不犹豫的选择BigDecimal,毕竟无论是java官方还是教科书都是这么说的.随着开发经验的增加.对性能优化的关注等等各种原因,很多的项目或系统开始

JAVA必背面试题和项目面试通关要点

一 数据库 1.常问数据库查询.修改(SQL查询包含筛选查询.聚合查询和链接查询和优化问题,手写SQL语句,例如四个球队比赛,用SQL显示所有比赛组合:举例2:选择重复项,然后去掉重复项:) 数据库里的密码如何加密(md5): (1)数据库的密码加密:单向加密,insert into users (username,password) values (‘mike’,MD5(‘guessme’)); (2)双向加密:insert into users (username ,password) va

web day25 web day24 小项目练习图书商城, 购物车模块,订单模块,支付(易宝支付)

购物车模块 购物车存储: 保存在session中(本次使用的) 保存在cookie中 保存在数据库中 购物车相关类 购物车结构 CartItem:包含图书和数量,小计 Cart:包含一个Map<String,CartItem>和部分购物车操作方法 修改登录方法,在用户登录成功后,马上在session中添加一辆车 页面负责遍历存在session域中的购物车属性 添加购物车条目 清空购物车条目 指定删除购物车条目 图 我的购物车 top.jsp中存在一个链接:我的购物车 我的购物车直接访问/jsp

004医疗项目-逆向工程-pojo类的创建和对应xml的生成

我们使用mybatis的逆向工程来生成pojo类,省去很多不必要的工作. 我把逆向工程需要的项目如下: GeneratorSqlmap.java是项目的主入口. GeneratorSqlmap.java代码如下: import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.mybatis.generator.api.MyBatisGen

BigIntager类和BigDecimal类

BigInteger类 BigInteger:可以让超过Integer范围内的数据进行运算 构造方法:      BigInteger(String val) 代码示例:BigInteger bi = new BigInteger("2147483648"); 成员方法: (1)public BigInteger add(BigInteger val):加     (2)public BigInteger subtract(BigInteger val):减     (3)public

BigDecimal 高精度计算 熟悉扩展,java除法保留小数问题

java保留两位小数问题: 方式一: 四舍五入  double   f   =   111231.5585;  BigDecimal   b   =   new   BigDecimal(f);  double   f1   =   b.setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue();  保留两位小数  --------------------------------------------------------------- 方式二

[转]double与BigDecimal

转自:http://superivan.iteye.com/blog/963628 [1] 精确的浮点运算: 在Java里面,有时候为了保证数值的准确性需要精确的数据,先提供一个例子就可以发现问题了: public class FloatNumberTester { public static void main(String args[]){ System.out.println(0.05+0.01); System.out.println(1.0 - 0.42); System.out.pr

重踏学习Java路上_Day14(正则表达式,Math,Random,System,BigInteger,BigDecimal,Date,Calendar)

1:正则表达式(理解)    (1)就是符合一定规则的字符串    (2)常见规则        A:字符            x 字符 x.举例:'a'表示字符a            \\ 反斜线字符.            \n 新行(换行)符 ('\u000A')             \r 回车符 ('\u000D')                    B:字符类            [abc] a.b 或 c(简单类)             [^abc] 任何字符,除了