前言:
在使用单双精度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());

博客探讨了在处理大规模小数运算时,单双精度浮点数存在的误差问题,推荐使用BigDecimal来确保计算精度。介绍了BigDecimal的舍入模式,并通过示例展示了从double转换为BigDecimal的方法。同时指出在进行BigDecimal加法运算时要注意对象赋值的正确方式,以避免结果为0的错误。建议在数值运算中优先选择String和int类型。
12万+

被折叠的 条评论
为什么被折叠?



