我们都知道,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类型的值通过调用doubleValue()方法转换为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.
相关推荐
在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术...
javascript的数值精确计算类bigdecimal,改编自java的bigdecimal
BigDecimal类,常用方法是用介绍
java丢失精度,bigdecimal加减乘除
BigDecimal工具类.docx
BigDecimal的计算
引用附件的JS,就可以轻松搞定JS的计算问题了。 使用例 <!-- function //+ alert(new BigDecimal("10").add(new BigDecimal("3E+10"))); //- alert(new BigDecimal("10").subtract(new BigDecimal("3E+10")));...
BigDecimal向Double转换
详细描述了BigDecimal类型的应用方式。
复杂的BigDecimal计算,需要开方的式子,可输入结果精确位数
bigdecimal加减乘除运算
bigdecimal转integer
string转bigdecimal类型
BigDecimal 使用方法小节:包含构造方法及和、差、商、积等运算方式
构造函数:解决了上面这个问题好像万事大吉了,结果,我在做测试的时候,又发现了一个莫名其妙的问题,代码如下: BigDecimal bd=supplierRecentProductDao.findHistoryReturnRate("001", "001"); assertEquals(bd....
BigDecimal类型使用
js中引入BigDecimal-all-last.min.js
BigInteger.java BigDecimal.java 文件 源代码
在一些需求中,我们可能需要将 BigDecimal 值转换为 Integer 类型。这时,可以使用 BigDecimal 的 intValue() 方法进行转换。 当 BigDecimal 值小于或等于 Integer.MAX_VALUE(2^31-1)时,intValue() 方法返回 ...
MyEditTextApplication输入框BigDecimal计算价格,实时输入计算价格并保留小数点后十位数字