最近搜索

Java中BigDecimal 相当操作 方法 高精度的数字操作。java

浏览:800
管理员 2021-11-30 02:08



四舍五入,以及保留x位数(保留2位小数)

//保留2位
x1 = x1.setScale(2,BigDecimal.ROUND_HALF_UP);    
ROUND_HALF_UP是我们常用的四舍五入



四舍五入,保留0位

BigDecimal c = new BigDecimal(31.12);
c = c.setScale(0,BigDecimal.ROUND_HALF_UP);
System.out.println(c);//输出31



   BigDecimal c = new BigDecimal(31.4999999999);
   c = c.setScale(0,BigDecimal.ROUND_HALF_UP);
   System.out.println(c);//输出31



加 

BigDecimal a1 = new BigDecimal(31.12);
a1 = a1.setScale(0,BigDecimal.ROUND_HALF_UP);//31

BigDecimal a2 = new BigDecimal("31");
BigDecimal a3 = new BigDecimal("31.00");

System.out.println(a1);//输出 31
System.out.println(a2);//输出 31
System.out.println(a3);//输出 31.00

System.out.println(a1.add(a2));//输出 62
System.out.println(a1.add(a3));//输出 62.00


 // 执行减法操作
BigDecimal result = num1.subtract(num2);


BigDecimal a = new BigDecimal("10.5");
BigDecimal b = new BigDecimal("2.5");
BigDecimal c = a.multiply(b);
System.out.println(c);


除 

x1 = x1.divide(new BigDecimal("0.002736"),5,BigDecimal.ROUND_HALF_UP); //相除保留x位,四舍五入,防止除不尽。



比较操作 大小。

BigDecimal a1 = new BigDecimal(31.12);
a1 = a1.setScale(0,BigDecimal.ROUND_HALF_UP);//31

BigDecimal a2 = new BigDecimal("31");
BigDecimal a3 = new BigDecimal("31.00");
System.out.println(a1);//输出 31
System.out.println(a2);//输出 31
System.out.println(a3);//输出 31.00
System.out.println(a1.compareTo(a2));//输出0
System.out.println(a1.compareTo(a3));//输出0





相除保留x位小数(防止除不尽)

//相除保留5位  按 四舍五入保留 (防止除不尽)
x1 = x1.divide(new BigDecimal("0.002736"),5,BigDecimal.ROUND_HALF_UP);



BigDecimal 注意事项,以及bug  直接输入数字是单精度的 要四舍五入格式一下

BigDecimal d = new BigDecimal("31.12");
BigDecimal c = new BigDecimal(31.12); //不建议直接输入数字  如果非常要这样,请保留2位小数,这样就避免了。
System.out.println(c);//31.120000000000000994759830064140260219573974609375
System.out.println(d);//31.12


//修改代码 保留2位小数  就正常了。
BigDecimal d = new BigDecimal("31.12");
BigDecimal c = new BigDecimal(31.12);
c = c.setScale(2,BigDecimal.ROUND_HALF_UP);
System.out.println(c);//31.12
System.out.println(d);//31.12






Java中BigDecimal取整方法
BigDecimal bd = new BigDecimal("12.1");long l  = bd.setScale( 0, BigDecimal.ROUND_UP ).longValue(); // 向上取整
long l  = bd.setScale( 0, BigDecimal.ROUND_DOWN ).longValue(); // 向下取整

* 对于正数而言,ROUND_UP  = ROUND_CEILING,ROUND_DOWN = ROUND_FLOOR



各个roundingMode详解如下:
ROUND_UP:非0时,舍弃小数后(整数部分)加1,比如12.49结果为13,-12.49结果为 -13
ROUND_DOWN:直接舍弃小数
ROUND_CEILING:如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作 (一句话:取附近较大的整数)
ROUND_FLOOR: 如果 BigDecimal 是正的,则做 ROUND_DOWN 操作;如果为负,则做 ROUND_UP 操作(一句话:取附近较小的整数)
ROUND_HALF_UP:四舍五入(取更近的整数)
ROUND_HALF_DOWN:跟ROUND_HALF_UP 差别仅在于0.5时会向下取整
ROUND_HALF_EVEN:取最近的偶数
ROUND_UNNECESSARY:不需要取整,如果存在小数位,就抛ArithmeticException 异常


联系站长

站长微信:xiaomao0055

站长QQ:14496453