我们都知道,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. STL中的查找算法

    STL中有很多算法,这些算法可以用到一个或多个STL容器(因为STL的一个设计思想是将算法和容器进行分离),也可以用到非容器序列比如数组中.众多算法中,查找算法是应用最为普遍的一类. 单个元素查找 1 ...

  2. 【ros】.bag文件

    Bags are typically created by a tool like rosbag They store the serialized message data in a file as ...

  3. Hbase的WAL在RegionServer基本调用过程

    版权声明:本文由熊训德原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/221 来源:腾云阁 https://www.qclo ...

  4. TestLink

    TestLink的主要功能包括: 测试需求管理 测试用例管理 测试用例对测试需求的覆盖管理 测试计划的制定 测试用例的执行 大量测试数据的度量和统计功能 TestLink的主要特色包括: 支持多产品或 ...

  5. 在python中使用matplotlib中的Matplotlib-Animation “No MovieWriters Available”

    在使用官方的示例代码中,一部分使用了ffmpeg 在执行时会报如题一样的错误 解决: 下载windows的版本,解压,然后将bin目录加入系统环境变量的路径中 如:D:\Program Files\f ...

  6. [CDN]CDN的系统架构

    ---恢复内容开始--- 1.功能架构: CDN技术自1998年诞生以来,伴随着互联网的高速发展,其技术一直在持续演进和完善,但基本的CDN功能架构在2003年左右就已基本形成和稳定下来.从功能上划分 ...

  7. ubuntu下安装svn服务器

    sudo apt-get install apache2 sudo apt-get install subversion sudo apt-get install libapache2-svn 其次, ...

  8. HANS123

    //策略:HANS123//周期:日内//类别:趋势突破 作为外汇市场上广为流行的一种突破交易策略,HANS123以其简洁的开盘后N根K线的高低点突破,作为交易信号触发的评判标准.这也是一种入场较早的 ...

  9. 18、(番外)匿名方法+lambda表达式

    概念了解: 1.什么是匿名委托(匿名方法的简单介绍.为什么要用匿名方法) 2.匿名方法的[拉姆达表达式]方法定义 3.匿名方法的调用(匿名方法的参数传递.使用过程中需要注意什么) 什么是匿名方法? 匿 ...

  10. Java 设计一个贷款计算器 简易

    import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.border.*; publi ...