BigDecimal的四则运算及小数位数格式

本文详细介绍BigDecimal类在Java中处理浮点数运算的方法,包括加法、减法、乘法、除法及小数位数的格式化。通过具体示例展示如何避免浮点数运算中的精度丢失问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、加法

BigDecimal b1 = new BigDecimal("20");
BigDecimal b2 = new BigDecimal("30");
BigDecimal add = b1.add(b2);
System.out.println(add);

打印结果:
50

二、减法

BigDecimal b1 = new BigDecimal("53.22");
BigDecimal b2 = new BigDecimal("25.14");
BigDecimal subtract = b1.subtract(b2);
System.out.println(subtract);

打印结果:
28.08
说明:
b1是被减数,b2是减数,小的减大的得负数,不报错

 三、乘法

BigDecimal b1 = new BigDecimal("2");
BigDecimal b2 = new BigDecimal("3");
BigDecimal multiply = b1.multiply(b2);
System.out.println(multiply);
打印结果:
6

BigDecimal b1 = new BigDecimal("2.30");
BigDecimal b2 = new BigDecimal("3.0");
BigDecimal multiply = b1.multiply(b2);
System.out.println(multiply);

打印结果:
6.900
说明:
小数相乘,不加限制的情况下,计算的结果小数点的保有量是两积数小数点位数之和

四、除法(分母不能为0)

总体说明:b1为被除数,b2为除数
BigDecimal b1 = new BigDecimal("30"); BigDecimal b2 = new BigDecimal("3"); BigDecimal divide = b2.divide(b1); System.out.println(divide);
打印结果:
0.1
说明:只能运算可以除尽的运算。

BigDecimal b1 = new BigDecimal("10");
BigDecimal b2 = new BigDecimal("3");
BigDecimal divide = b1.divide(b2,3,RoundingMode.HALF_DOWN);
System.out.println(divide);
打印结果:
3.333
说明:第一个参数(b2):除数
第二个参数(3):小数点之后保留几位
第三个参数(RoundingMode.HALF_DOWN):舍入模式
舍入模式参数说明(加入数轴概念):

         RoundingMode.CEILING:取右边最近的整数

         RoundingMode.DOWN:去掉小数部分取整,也就是正数取左边,负数取右边,相当于向原点靠近的方向取整

         RoundingMode.FLOOR:取左边最近的正数

         RoundingMode.HALF_DOWN:五舍六入,负数先取绝对值再五舍六入再负数

         RoundingMode.HALF_UP:四舍五入,负数原理同上

         RoundingMode.HALF_EVEN:这个比较绕,整数位若是奇数则四舍五入,若是偶数则五舍六入

 五、小数位数和取值的格式化

BigDecimal bigDecimal = new BigDecimal("2.35645");
System.out.println("原始的" + bigDecimal);
BigDecimal bigDecimal1 = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("格式化后" + bigDecimal1);

打印结果:
原始的2.35645
格式化后2.36
setScale()方法参数介绍:
第一个参数:小数点后保留的位数
第二个参数:舍入模式
舍入模式列举:
setScale(1)表示保留一位小数,默认用四舍五入方式 这种模式可能会有问题,可能会报(java.lang.ArithmeticException: Rounding necessary),请测试后使用
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3 数据取整可用(向下取整)
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4 数据取整可用 (向上取整)
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)五舍六入,2.55变成2.5/2.551变成2.6,如果是5则向下舍
setScaler(1,BigDecimal.ROUND_CEILING)接近正无穷大的舍入
setScaler(1,BigDecimal.ROUND_FLOOR)接近负无穷大的舍入,数字>0和ROUND_UP作用一样,数字<0和ROUND_DOWN作用一样
setScaler(1,BigDecimal.ROUND_HALF_EVEN)向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

 

转载于:https://www.cnblogs.com/lu51211314/p/9530083.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值