前言:
在使用单双精度float和double的运算过程中面对千万级的小数级上出现错误,对于我们的项目而言很不友好,对此BigDecimal
就能很好的解决问题所在BigDecimal
类提供了算术,缩放操作,舍入,比较,散列和格式转换的操作。
BigDecimal的使用:
ONE
//值1,标度为0。
ROUND_CEILING
//向正无穷方向舍入
ROUND_DOWN
//向零方向舍入
ROUND_FLOOR
//向负无穷方向舍入
ROUND_HALF_DOWN
//向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN
//向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP
//向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6
ROUND_UNNECESSARY
//计算结果是精确的,不需要舍入模式
ROUND_UP
//向远离0的方向舍入
由于我们使用的都在小数点后俩位,需要设入后俩位
BigDecimal(double val, MathContext mc)
//将 double转换为 BigDecimal ,根据上下文设置进行舍入。
BigDecimal(double val) //将 double转换为 BigDecimal ,这是 double的二进制浮点值的精确十进制表示。
用这种方法转换而成的BigDecimal对象,最终获取的值与我们想要的值不相同比如:
BigDecimal d1 = new BigDecimal(0.6);
输出值为:
0.59999999999999997779553950749686919152736663818359375
而对于String类型和int类型的数值来说就没有这种问题,所以在数值存放运算时尽量使用String类型和int类型转换数值
在使用BigDecimal
加法时出现为0的情况
BigDecimal sum= new BigDecimal("0");
sum.add(entity.getB_points_available());
这是因为在bigdecimal运算时不会将结果赋予原来运算的对象而是新产生的对象,所以要使用另外的对象接收数值
sum=sum.add(entity.getB_points_available());