BigDecimal 类的使用

84 篇文章 0 订阅
79 篇文章 0 订阅

1、使用 BigDecimal 的原因
  由于需要计算金额,所有需要高精度计算,所有需要使用 BigDecimal 类。
BigDecimal能够精确的表示一个小数,常用于商业和科学计算;float,double不能精确的表示一个小数。

2、常用方法
2.1 加法(add)
  分别用两种不同的数据类型(long 和 string)创建 BigDecimal 对象;
  

import java.math.BigDecimal;

public class BigDecimalTest {
/**
* 使用BigDecimal,参数类型是double类型,计算还是不精确
*/
@Test
public void testAdd1(){
BigDecimal b1 = new BigDecimal(0.05);
BigDecimal b2 = new BigDecimal(0.01);
System.out.println(b1.add(b2));
//输出:0.06000000000000000298372437868010820238851010799407958984375
}

/**
 * 使用BigDecimal,参数类型是String类型,计算结果精确
 */
@Test
public void testAdd2(){
    BigDecimal b1 = new BigDecimal("0.05");
    BigDecimal b2 = new BigDecimal("0.01");
    System.out.println(b1.add(b2));  
    //输出:0.06
}

}
从上面的结果可以看出使用 string 类型的才能得到精确的计算结果。所有在计算金额时注意使用 string 类型创建对象。

2.2 减法(subtract)

import java.math.BigDecimal;

public class BigDecimalTest {
/**
* 测试减法 参数类型是double类型,计算还是不精确
*/
@Test
public void testSubtract1(){
BigDecimal b1 = new BigDecimal(0.05);
BigDecimal b2 = new BigDecimal(0.01);
System.out.println(b1.subtract(b2));
//输出:0.04000000000000000256739074444567449972964823246002197265625
}

/**
 * 测试减法,参数类型是String类型,计算结果精确
 */
@Test
public void testSubtract2(){
    BigDecimal b1 = new BigDecimal("0.05");
    BigDecimal b2 = new BigDecimal("0.01");
    System.out.println(b1.subtract(b2));
    //输出:0.04
}

}
2.3 乘法(multiply)

import java.math.BigDecimal;

public class BigDecimalTest {
/**
* 测试乘法 参数类型是double类型,计算还是不精确
*/
@Test
public void testMultiply1(){
BigDecimal b1 = new BigDecimal(0.05);
BigDecimal b2 = new BigDecimal(0.01);
System.out.println(b1.multiply(b2));
//输出:0.0005000000000000000381639164714897566548413219067927041589808827754781955614304944646164585719816386699676513671875
}

/**
 * 测试乘法,参数类型是String类型,计算结果精确
 */
@Test
public void testMultiply2(){
    BigDecimal b1 = new BigDecimal("0.05");
    BigDecimal b2 = new BigDecimal("0.01");
    System.out.println(b1.multiply(b2));
    //输出:0.0005
}

}
2.4 除法(divide)
2.4.1 除不尽,报错
  由于10/3除不尽,商是无限小数,所以报错;

  Non-terminating decimal expansion; no exact representable decimal result.
  

import java.math.BigDecimal;

public class BigDecimalTest {
/**
* 测试除法 参数类型是double类型
*/
@Test
public void testDivide1(){
BigDecimal b1 = new BigDecimal(0.1);
BigDecimal b2 = new BigDecimal(0.03);
System.out.println(b1.divide(b2));
//报错 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
}

/**
 * 测试除法,参数类型是String类型
 */
@Test
public void testDivide2(){
    BigDecimal b1 = new BigDecimal("0.1");
    BigDecimal b2 = new BigDecimal("0.03");
    System.out.println(b1.divide(b2));
    //报错 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
}

}
2.4.2 解决办法
  其实devide的函数定义如下:

BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode);

scale为小数位数;
roundingMode为小数模式;
小数模型有以下类型:

ROUND_CEILING
如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作。
ROUND_DOWN
从不在舍弃(即截断)的小数之前增加数字。
ROUND_FLOOR
如果 BigDecimal 为正,则作 ROUND_UP ;如果为负,则作 ROUND_DOWN 。
ROUND_HALF_DOWN
若舍弃部分> .5,则作 ROUND_UP;否则,作 ROUND_DOWN 。
ROUND_HALF_EVEN
如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP ;如果它为偶数,则作 ROUND_HALF_DOWN 。
ROUND_HALF_UP
若舍弃部分>=.5,则作 ROUND_UP ;否则,作 ROUND_DOWN 。
ROUND_UNNECESSARY
该“伪舍入模式”实际是指明所要求的操作必须是精确的,,因此不需要舍入操作。
ROUND_UP
总是在非 0 舍弃小数(即截断)之前增加数字。
  所有除法应该写成以下形式;

BigDecimal num3 = num1.divide(num2,10,ROUND_HALF_DOWN);

import java.math.BigDecimal;

public class BigDecimalTest {
/**
* 测试除法 参数类型是double类型
*/
@Test
public void testDivide3(){
BigDecimal b1 = new BigDecimal(0.1);
BigDecimal b2 = new BigDecimal(0.03);
System.out.println(b1.divide(b2, 10, ROUND_HALF_DOWN));
//输出:3.3333333333
}

/**
 * 测试除法,参数类型是String类型
 */
@Test
public void testDivide4(){
    BigDecimal b1 = new BigDecimal("0.1");
    BigDecimal b2 = new BigDecimal("0.03");
    System.out.println(b1.divide(b2, 10, ROUND_HALF_DOWN));
    //输出:3.3333333333
}
3、小结

使用 string 类型创建 BigDecimal 对象来进行精确计算;
进行除法计算时,需要添加参数(scale)小数位数和(roundingMode)小数模式;避免出现除不尽报错的现象;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BigDecimal是Java中用来处理高精度数值计算的。它可以处理任意精度的小数,避免了使用double或float型时可能遇到的精度问题。 以下是使用BigDecimal的一些基本操作: 1. 创建BigDecimal对象 可以通过以下方式创建BigDecimal对象: ``` BigDecimal num = new BigDecimal("123.456"); ``` 2. 四则运算 可以使用add、subtract、multiply、divide方法进行加、减、乘、除运算,例如: ``` BigDecimal num1 = new BigDecimal("123.456"); BigDecimal num2 = new BigDecimal("789.012"); BigDecimal result1 = num1.add(num2); // 加法 BigDecimal result2 = num1.subtract(num2); // 减法 BigDecimal result3 = num1.multiply(num2); // 乘法 BigDecimal result4 = num1.divide(num2, 2, RoundingMode.HALF_UP); // 除法,保留两位小数,四舍五入 ``` 3. 比较大小 可以使用compareTo方法比较两个BigDecimal对象的大小,例如: ``` BigDecimal num1 = new BigDecimal("123.456"); BigDecimal num2 = new BigDecimal("789.012"); int result = num1.compareTo(num2); if (result > 0) { System.out.println("num1 > num2"); } else if (result < 0) { System.out.println("num1 < num2"); } else { System.out.println("num1 = num2"); } ``` 4. 转换为其他型 可以使用toXXX方法将BigDecimal对象转换为其他型的数值,例如: ``` BigDecimal num = new BigDecimal("123.456"); int i = num.intValue(); // 转换为int型 double d = num.doubleValue(); // 转换为double型 ``` 以上是BigDecimal的一些基本操作,还有很多其他方法可以参考Java官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值