BigDecimal使用

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

在使用单双精度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类是Java中处理高精度数值运算的强大工具,可执行精确的数学运算,避免浮点数的舍入误差,在金融和科学计算等需要高精度的场合不可或缺。以下是其常见使用方法: ### 初始化BigDecimal对象 可使用不同的构造方法来初始化。例如,使用`new BigDecimal(double)`和`new BigDecimal(String)`: ```java import java.math.BigDecimal; public class BigDecimalInitialization { public static void main(String[] args) { BigDecimal a = new BigDecimal(0.1); System.out.println("a values is:" + a); System.out.println("====================="); BigDecimal b = new BigDecimal("0.1"); System.out.println("b values is:" + b); } } ``` 这里使用`new BigDecimal(String)`能更精确地表示数值,因为`new BigDecimal(double)`可能会有舍入误差[^2]。 ### 基本数学运算 提供了一系列方法进行加法、减法、乘法和除法运算: ```java import java.math.BigDecimal; public class BigDecimalMathOperations { public static void main(String[] args) { BigDecimal num1 = new BigDecimal("130.512"); BigDecimal num2 = new BigDecimal("15.7"); // 加法 BigDecimal sum = num1.add(num2); System.out.println("加法结果: " + sum); // 减法 BigDecimal difference = num1.subtract(num2); System.out.println("减法结果: " + difference); // 乘法 BigDecimal product = num1.multiply(num2); System.out.println("乘法结果: " + product); // 除法(四舍五入保留2位小数) BigDecimal quotient = num1.divide(num2, 2, java.math.RoundingMode.HALF_UP); System.out.println("除法结果: " + quotient); } } ``` 上述代码展示了使用`add`、`subtract`、`multiply`和`divide`方法进行基本数学运算,除法时指定了保留小数位数和舍入模式[^1]。 ### 比较大小 通过`compareTo(BigDecimal)`方法来比较大小: ```java import java.math.BigDecimal; import org.junit.Test; public class BigDecimalComparison { @Test public void test4() { BigDecimal a = new BigDecimal("1"); BigDecimal b = new BigDecimal("2"); BigDecimal c = new BigDecimal("1"); int result1 = a.compareTo(b); int result2 = a.compareTo(c); int result3 = b.compareTo(a); System.out.println(result1); // -1 System.out.println(result2); // 0 System.out.println(result3); // 1 } } ``` 使用该方法时,若返回值为 -1 表示小于,0 表示等于,1 表示大于。需注意不能使用`equals`方法来比较大小,同时使用BigDecimal性能比`double`和`float`差,处理庞大、复杂运算时尤为明显,要根据实际需求选择使用哪种类型[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Array_new

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值