BigDecimal类的基础知识整理

    技术2022-07-10  179

    loat和double类型无法提供完全精确的计算结果,所以不能被应用于要求计算完全精确结果的场合,这时候就需要使用BigDecimal类。

    /** * @description: BigDecimal类的测试类 * @author: Murphy * @date: 2020/7/112:31 上午 */ public class BigDecimalDemo { public static void main(String[] args) { double a = 0.1; double b = 0.2; System.out.println(a + b);//输出结果:0.30000000000000004 } }

    造成上述结果的原因:float和double类型的设计目标主要是为了科学计算和工程计算,它们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的,因此无法提供完全精确的结果。计算机是二进制的,浮点数没办法用二进制进行精确表示,因此浮点数运算会产生一定误差,例如2.4的二进制表示并非就是精确的二进制,浮点数的值实际上是由一个特定的数学公式计算得到的。

    BigDecimal类的构造方法:

    ①public BigDecimal(double val):这种构造方法不建议使用,原因是double类型无法被精确表示,因此不能作为参数传入;

    ②public BigDecimal(int val):将int类型转换成BigDecimal类型;

    ③public BigDecimal(String val):建议使用。

    /** * @description: BigDecimal类的测试类 * @author: Murphy * @date: 2020/7/112:31 上午 */ public class BigDecimalDemo { public static void main(String[] args) { BigDecimal a = new BigDecimal(0.1); BigDecimal b = new BigDecimal(0.2); BigDecimal c = new BigDecimal("0.1"); BigDecimal d = new BigDecimal("0.2"); System.out.println(a.add(b));//0.3000000000000000166533453693773481063544750213623046875 System.out.println(c.add(d));//0.3 } }

    对于常用的加减乘除运算,BigDecimal类提供了常用的方法:

    ①public BigDecimal add(BigDecimal val):加法;

    ②public BigDecimal substract(BigDecimal val):减法;

    ③public BigDecimal multiply(BigDecimal val):乘法;

    ④public BigDecimal divide(BigDecimal val):除法。

    /** * @description: BigDecimal类的测试类 * @author: Murphy * @date: 2020/7/112:31 上午 */ public class BigDecimalDemo { public static void main(String[] args) { BigDecimal a = new BigDecimal("4.5"); BigDecimal b = new BigDecimal("1.3"); System.out.println(a.divide(b)); } } //输出结果: Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

    造成上述结果的原因是:不能整除,此时需要设置其他参数。

    public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode):第一个参数表示除数,第二个参数表示小数点后保留单位数,第三个参数表示舍入模式,常规使用RoundingMode.HALF_UP,表示四舍五入。

    /** * @description: BigDecimal类的测试类 * @author: Murphy * @date: 2020/7/112:31 上午 */ public class BigDecimalDemo { public static void main(String[] args) { BigDecimal a = new BigDecimal("4.5"); BigDecimal b = new BigDecimal("1.3"); System.out.println(a.divide(b, 4, RoundingMode.HALF_UP)); } } //输出结果: 3.4615
    Processed: 0.017, SQL: 9