BigDecimal的创建方式、加减乘除、舍入模式、和其他类型的转换

BigDecimal的创建方式、加减乘除、舍入模式、和其他类型的转换

  • 1、简介
  • 2、常用API方法
    • 2.1 BigDecimal创建的几种方式
    • 2.2 BigDecimal和其他类型之间的转换
      • 2.2.1、BigDecimal转double
      • 2.2.2、double转BigDecimal
      • 2.2.3、字符串转BigDecimal
      • 2.2.4、int和long转BigDecimal
      • 2.2.5、BigDecimal转int和long
    • 2.3 BigDecimal中的加减乘
    • 2.4 BigDecimal中的舍入模式
      • 2.4.1 ROUND_CEILING
      • 2.4.2 ROUND_DOWN
      • 2.4.3 ROUND_HALF_UP
      • 2.4.4 ROUND_UNNECESSARY
    • 2.5 BigDecimal中的除
    • 2.5 BigDecimal舍入模式枚举说明

1、简介

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。

项目中一般涉及到金额的数据,都会用到BigDecimal。 我是喜欢在保留几位小数的时候用到,这个主要看个人习惯。

2、常用API方法

2.1 BigDecimal创建的几种方式

BigDecimal bigDecimal1 = new BigDecimal("3.14");
BigDecimal bigDecimal2 = new BigDecimal(314);
BigDecimal bigDecimal3 = new BigDecimal(314L);
/**
* 不推荐该方式,因为会损失精度
**/
BigDecimal bigDecimal4 = new BigDecimal(3.14);
System.out.println(bigDecimal1);
//3.14
System.out.println(bigDecimal2);
//314
System.out.println(bigDecimal3);
//314
System.out.println(bigDecimal4);
//3.140000000000000124344978758017532527446746826171875
/**
* 特殊的0,1,10创建方式
**/
BigDecimal zero = BigDecimal.ZERO;   
BigDecimal one = BigDecimal.ONE;
BigDecimal ten = BigDecimal.TEN;

2.2 BigDecimal和其他类型之间的转换

2.2.1、BigDecimal转double

BigDecimal latitude = 3.1415926;
double latitudeDou = latitude.doubleValue()

2.2.2、double转BigDecimal

#方式1
double dou = 3.1415926;
BigDecimal latitude = BigDecimal.valueOf(dou);
        
#方式2 不推荐,会丢失精度问题
BigDecimal bigDecimal = new BigDecimal(3.1415926);

2.2.3、字符串转BigDecimal

BigDecimal bigDecimal = new BigDecimal("1.2");
System.out.println(bigDecimal);//1.2

2.2.4、int和long转BigDecimal

BigDecimal decimalLong = new BigDecimal(12L);
System.out.println(decimalLong);//12
BigDecimal decimalInt = new BigDecimal(12);
System.out.println(decimalInt);//12

2.2.5、BigDecimal转int和long

 BigDecimal decimalLong = new BigDecimal(12L);
 System.out.println(decimalLong.longValue());//12
 BigDecimal decimalInt = new BigDecimal(12);
 System.out.println(decimalInt.intValue());//12

2.3 BigDecimal中的加减乘

先说下加减乘,除法在了解舍入模式后在说。

1、add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
/**
 * 3.14加10加5
 */
BigDecimal bigDecimal = new BigDecimal("3.14");
BigDecimal ten = BigDecimal.TEN;
BigDecimal bigDecimal1 = new BigDecimal(5);
BigDecimal add = bigDecimal.add(ten).add(bigDecimal1);
System.out.println(add);//18.14
2、subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
/**
* 5减3.14
*/
BigDecimal bigDecimal = new BigDecimal("3.14");
BigDecimal bigDecimal1 = new BigDecimal(5);
BigDecimal subtract = bigDecimal1.subtract(bigDecimal);
System.out.println(subtract);//1.86
3、multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
/**
* 5乘3.14
*/
BigDecimal bigDecimal = new BigDecimal("3.14");
BigDecimal bigDecimal1 = new BigDecimal(5);
BigDecimal multiply = bigDecimal1.multiply(bigDecimal);
System.out.println(multiply);//15.70

2.4 BigDecimal中的舍入模式

舍入模式就是在遇到小数时怎么保留,最常见的就是四舍五入。

2.4.1 ROUND_CEILING

ROUND_CEILING表示向正无穷方向舍入。下面参数1代表保留一位小数,只要后面有两位小数,前方就会加1。 如果参数为2,结果就是3.15。如果参数为0,结果就是4。
BigDecimal bigDecimal = new BigDecimal("3.141");
BigDecimal scale = bigDecimal.setScale(1, BigDecimal.ROUND_CEILING);
System.out.println(scale);//3.2

2.4.2 ROUND_DOWN

ROUND_DOWN向零方向舍入。下面参数为1时,结果3.9。如果参数为2,结果就是3.91。如果参数为0,结果就是3。
BigDecimal bigDecimal = new BigDecimal("3.912");
BigDecimal scale = bigDecimal.setScale(1, BigDecimal.ROUND_DOWN);
System.out.println(scale);

2.4.3 ROUND_HALF_UP

ROUND_HALF_UP这个就是我们常说的“四舍五入”,也是用的最多的一个。
BigDecimal bigDecimal = new BigDecimal("3.661");
BigDecimal scale = bigDecimal.setScale(1, BigDecimal.ROUND_HALF_UP);
System.out.println(scale);

2.4.4 ROUND_UNNECESSARY

ROUND_UNNECESSARY表示计算结果是精确的,不需要舍入模式。

2.5 BigDecimal中的除

4、divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
/**
* 10除以2
*/
BigDecimal divide = new BigDecimal(10).divide(new BigDecimal(2));
System.out.println(divide);//5
注意:在进行除法运算时,结果如果有小数,会报错误:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。
要避免这个错误产生,在进行除法运算的时候,针对可能出现的小数产生的计算,必须要多传两个参数。
divide(BigDecimal,保留小数点后几位小数,舍入模式)
/**
 * 10除以3
 * 四舍五入保留两位小数
 */
BigDecimal divide = new BigDecimal(10).divide(new BigDecimal(3), 2, BigDecimal.ROUND_HALF_UP);
System.out.println(divide);//3.33

2.5 BigDecimal舍入模式枚举说明

可以发现,下面舍入模式写法是不一样的BigDecimal.ROUND_HALF_UP和RoundingMode.HALF_UP。点进去源码可以看到,枚举RoundingMode.HALF_UP中定义的就是BigDecimal.ROUND_HALF_UP。 所以这两个写法表示的是同一个东西
/**
 * 10除以3
 * 四舍五入保留两位小数
 */
BigDecimal divide1 = new BigDecimal(10).divide(new BigDecimal(3), 2, RoundingMode.HALF_UP);
BigDecimal divide2 = new BigDecimal(10).divide(new BigDecimal(3), 2, BigDecimal.ROUND_HALF_UP);
System.out.println(divide1+"---"+divide2);
//3.33---3.33

你可能感兴趣的:(研究,java,java-ee)