(六)Java-BigDecimal

一、概述

  BigDecimal 类用于高精度计算,特别适用于需要进行精确浮点数运算的场合,例如货币计算、金融应用或科学计算。

二、优势

  由于 double 和 float 类型是浮点数类型,它们在表示一些十进制数时会出现精度丢失问题,而 BigDecimal 则可以避免这些问题,提供任意精度的数值表示。

三、特点

1.任意精度:BigDecimal 的精度仅受限于计算机的内存,而不像 float 和 double 有固定的精度限制。

2.避免精度丢失:与 double 和 float 类型不同,BigDecimal 通过精确地表示小数部分,避免了由于浮点运算引起的精度误差。

3.不可变对象:BigDecimal 是不可变类,一旦创建了 BigDecimal 对象,其值就不能被修改,任何对其进行的修改操作都会返回一个新的 BigDecimal 对象

四、创建 BigDecimal 对象

推荐:

BigDecimal bd1 = new BigDecimal("3.14159");

BigDecimal bd4 = BigDecimal.valueOf(0.1);

不推荐:(精度误差)

BigDecimal bd3 = new BigDecimal(0.1);

五、常用的 BigDecimal 方法

1.加法、减法、乘法和除法

加法:add(BigDecimal val)

减法:subtract(BigDecimal val)

乘法:multiply(BigDecimal val)

除法:divide(BigDecimal val, int scale, RoundingMode roundingMode)

-注意,除法需要指定精度(scale)和舍入模式(roundingMode)。

BigDecimal a = new BigDecimal("10.5");

BigDecimal b = new BigDecimal("2.3");

BigDecimal sum = a.add(b);          // 加法

BigDecimal difference = a.subtract(b);  // 减法

BigDecimal product = a.multiply(b);  // 乘法

BigDecimal quotient = a.divide(b, 2, RoundingMode.HALF_UP);  // 除法,保留2位小数,四舍五入

2.精度和舍入模式

通常需要指定精度(即小数点后保留的位数)和舍入模式(RoundingMode)

BigDecimal bd1 = new BigDecimal("10");

BigDecimal bd2 = new BigDecimal("3");

// 使用不同的舍入模式

BigDecimal result = bd1.divide(bd2, 2, RoundingMode.HALF_UP);  // 保留2位小数,四舍五入

System.out.println(result);  // 输出 3.33

result = bd1.divide(bd2, 2, RoundingMode.FLOOR);  // 向下舍入

System.out.println(result);  // 输出 3.33

常用的舍入模式:

RoundingMode.HALF_UP:四舍五入(常用)。

RoundingMode.FLOOR:向零方向舍入(向下)。

RoundingMode.CEILING:向正无穷大方向舍入(向上)。

RoundingMode.DOWN:直接舍去尾数。

3.比较 BigDecimal 对象

方法:compareTo()

如果返回 0,表示两个值相等。

如果返回 -1,表示第一个值小于第二个值。

如果返回 1,表示第一个值大于第二个值。

BigDecimal bd1 = new BigDecimal("10.5");

BigDecimal bd2 = new BigDecimal("10.500");

int comparisonResult = bd1.compareTo(bd2);

4.转换为其他类型

可以与其他数值类型(如 int、double、long)进行转换。

转换为 int 或 long 时,BigDecimal 会丢弃小数部分

BigDecimal bd = new BigDecimal("123.456");

// 转换为 int

int intValue = bd.intValue(); //123

// 转换为 long

long longValue = bd.longValue(); //123

// 转换为 double

double doubleValue = bd.doubleValue(); //123.456

你可能感兴趣的:(Java体系,java,开发语言)