介绍
我们知道Java中有float和double类型,它们的主要设计目标是科学计算和工程计算。然而,它们不能提供完全精确的结果[因为它们的有效数字有限],因此它们不应该用于需要精确结果的场合。然而,商业计算通常需要更精确的结果。这个时候BigDecimal的重要性就不言而喻了!
BigDecimal简介
BigDecimal由任意精度的整数无标度值和32位整数组成。BigDecimal创建的是一个对象。我们不能用+、-、*、/等传统的算术运算符直接对它的对象进行数学运算,而必须调用它对应的方法。方法中的参数也必须是BigDecimal的对象。
BigDecimal有四种构造方法:
BigDecimal(int)用参数指定的整数值创建一个对象。
BigDecimal(double)使用参数指定的双精度值创建对象。
BigDecimal(long)使用参数指定的长整型值创建对象。
BigDecimal(String)用参数指定的数值作为字符串创建一个对象。
BigDecimal的运算方式不支持+-*/并且有自己的运算方法:
BigDecimal add(BigDecimal被加数)加法运算。
Bigdecimal subtract(Bigdecimal subtract)减法运算。
Bigdecimal multiply(Bigdecimal multiply)乘法运算。
Bigdecimal divide(Bigdecimal divider)除法运算。
示例代码
构造函数(两个常见的构造函数,其主要测试参数类型是double和String)
BigDecimal a double = new BigDecimal(1.22);
System.out.println("构造函数接受double类型的值,结果为:"+a double ");
BigDecimal aString = new BigDecimal(" 1.22 ");
System.out.println("构造函数接受String类型的值,结果为:"+aString ");
你认为输出会是什么?输出结果如下:
构造函数接受double类型的值,结果是
1.2199999999999999733546474089962430298328399658203125
构造函数接受一个字符串值,结果是:1.22
JDK大十进制的描述
1.双参数类型的构造方法的结果是不可预测的。有人可能会认为用Java写newBigDecimal(0.1)创建的BigDecimal正好等于0.1(非定标值1,其小数位数为1),但实际上等于0.1000000000000005这是因为0.1无法精确表示为double(或者在这种情况下,无法表示为任意有限长度的二进制小数)。因此,传入构造函数的值不会恰好等于0.1(尽管表面上等于该值)。
2.另一方面,字符串构造方法是完全可预测的:编写newBigDecimal("0.1 ")将创建一个BigDecimal,它正好等于预期的0.1。所以相比较而言,通常建议先用字符串构造法。
3.当double必须作为BigDecimal的源时,请注意这种构造方法提供了一种准确的转换;它提供的结果与下面的不同:首先使用Double.toString(double)方法,然后使用
BigDecimal (String)构造了一个将double转换为String的方法。要获得结果,请使用静态valueOf(double)方法。
加法运算
BigDecimal a = new BigDecimal(" 1.22 ");
System.out.println("构造函数接受String类型的值,结果为:"+a ");
BigDecimal b = new BigDecimal(" 2.22 ");
a .增加(b);
System.out.println("此时a的值为:"+a ");
很容易认为它会输出:
构造函数接受一个字符串值,结果是:1.22
此时a的值为:3.44。
但实际上调用方法后A的值是:1.22
摘要
(1) BigDecimal一般用于商业计算,因为涉及金额和数据,所以必须有超高的精度要求。
(2)尽量使用参数类型为String的构造函数。
(3)BigDecimal是不可变的,每次运算都会生成一个新的对象,所以做加减乘除时一定要保存运算后的值。
(4)我们往往会忽略JDK底层的一些实现细节,从而导致错误,需要更多的关注。
需要更多干货笔记的朋友,欢迎关注微信官方账号【老九书院】(づ 3 づ) ~