简介
float和double类型的使用局限:
单精度浮点型变量float可以处理6~7位有效数,双精度浮点型变量double可以处理15~16位有效数,在实际应用中,如果需要对更大或者更小的数进行运算和处理,这时候float和double就如能为力了。
借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算,他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。
BigDecimal
public class BigDecimal extends Number implements Comparable
BigDecimal用来对超过16位有效位的数进行精确的运算。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。
BigDecimal 由【任意精度的整数非标度值】和【32 位的整数标度 (scale)】组成。如果为零或正数,则标度是小数点后的位数;如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。因此,BigDecimal表示的数值是【unscaledValue * 10^-scale】。
JDK中对BigDecimal的定义为:不可变的、任意精度的有符号十进制数。
BigDecimal 类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。toString() 方法提供 BigDecimal 的规范表示形式。
注意,BigDecimal对象是不可变的(immutable)的(像String、BigInteger一样),我们在调用其加减乘除等方法后,其实最终都返回的是一个新的BigDecimal对象,所以在做每一步运算时一定要保存操作后的值。
BigDecimal bd = BigDecimal.valueOf(0.4);
BigDecimal bd2 = BigDecimal.valueOf(0.6);
bd.add(bd2);//虽然做了加法操作,但是bd并没有保存加操作后的值
bd2 = bd.add(bd2);//bd2指向了一个新的BigDecimal对象的引用
System.out.println(bd.doubleValue() + " " + bd2.doubleValue());//0.4 1.0
System.out.println(BigDecimal.valueOf(0.4).add(BigDecimal.valueOf(0.6)));//1.0。计算时一般都会链式调用
MathContext 类
public final class MathContext extends Object implements Serializable
该对象是封装上下文设置的不可变对象,它描述数字运算符的某些规则,例如由 BigDecimal 类实现的规则。
基本独立设置为:
precision:某个操作使用的数字个数;结果舍入到此精度
roundingMode:一个 RoundingMode 对象,该对象指定舍入使用的算法。
构造方法
MathContext(int setPrecision)构造一个新的 MathContext,它具有指定的精度和 HALF_UP 舍入模式。 参数setPrecision为非负 int 精度设置。
MathContext(int setPrecision, RoundingMode setRoundingMode)构造一个新的 MathContext,它具有指定的精度和舍入模式。
MathContext(String val)根据字符串构造一个新的 MathContext。该字符串的格式必须与 toString() 方法生成的字符串的格式相同。
静态字段
static MathContext DECIMAL128:一个 MathContext 对象,其精度设置与 IEEE 754R Decimal128 格式(即 34 个数字)匹配,舍入模式为 HALF_EVEN,这是 IEEE 754R 的默认舍入模式。
static MathContext DECIMAL32 :一个 MathContext 对象,其精度设置与 IEEE 754R Decimal32 格式(即 7 个数字)匹配,舍入模式为 HALF_EVEN,这是 IEEE 754R 的默认舍入模式。
static MathContext DECIMAL64 :一个 MathContext 对象,其精度设置与 IEEE 754R Decimal64 格式(即 16 个数字)匹配,舍入模式为 HALF_EVEN,这是 IEEE 754R 的默认舍入模式。
static MathContext UNLIMITED :其设置具有无限精度算法所需值的 MathContext 对象。该设置的值为: precision=0,roundingMode=HALF_UP
PS:默认的HALF_EVEN模式不是"四舍五入"的模式,我们最好改为HALF_UP模式。
公共方法
int getPrecision()返回 precision 设置。此值始终为非负数。
RoundingMode getRoundingMode()返回 roundingMode 设置。它将是8种RoundingMode之一。
boolean equals(Object x)将此 MathContext 与指定的 Object 进行相等性比较。
int hashCode()返回此 MathContext 的哈希码。
String toString()返回此 MathContext 的字符串表示形式。
构造方法
通过BigInteger构造BD
BigDecimal(BigInteger val) 将 BigInteger 转换为 BigDecimal。
BigDecimal(BigInteger unscaledVal, int scale) 将 BigInteger 非标度值和 int 标度转换为 BigDecimal。
【带MathContext参数--根据上下文设置进行舍入】BigDecimal(BigInteger val, MathContext mc)
BigDecimal(BigInteger unscaledVal, int scale, MathContext mc)
通过char[]构造BD
BigDecimal(char[] in) 将 BigDecimal 的字符数组表示形式转换为 BigDecimal,接受与 BigDecimal(String) 构造方法相同的字符序列。
BigDecimal(char[] in, int offset, int len) 将 BigDecimal 的字符数组表示形式转换为 BigDecimal,接受与 BigDecimal(String) 构造方法相同的字符序列,同时允许指定子数组。
【带MathContext参数--根据上下文设置进行舍入】BigDecimal(char[] in, MathContext mc)
BigDecimal(char[] in, int offset, int len, Ma