前段时间刚做的一个功能,做额度相关处理的时候用到了BigDecimal,整理如下:
首先我们为什么要用BigDecimal,float和double不香了么?
是的他不香。
可以自己尝试一下在控制台输出一些浮点数四则运算的结果:
可以发现,在千万甚至亿万的小数级上会出现错误,并且只有浮点数会这样,为什么?
我们的计算机是二进制的,而浮点数没有办法用二进制精确表示,计算机中的浮点数由三部分组成:符号位S,指数部分E(称为阶码)和尾数部分M,这样会丢失一部分精度,有些运算也会产生一部分误差,所以,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。
BigDecimal由任意精度的整数非标度值 和32位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以10的负scale次幂。因此,BigDecimal表示的数值是(
- 常用变量:
BigDecimal.ZERO:值0,标度0;
BigDecimal.ONE:值1,标度0;
BigDecimal.TEN:值10,标度0;
- 常用构造方法:推荐用String参数的构造方法,因为精度是明确的
BigDecimal(int); // 创建一个具有参数所指定整数值的对象
BigDecimal(double); // 创建一个具有参数所指定双精度值的对象
BigDecimal(long); // 创建一个具有参数所指定长整数值的对象
BigDecimal(String); // 创建一个具有参数所指定以字符串表示的数值的对象
- 四则运算:BigDecimal所创建的是对象,所以我们不能使用传统的+、-、*、/ 等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。
BigDecimal
- 其他运算相关方法
// 比较大小
- 类型转换方法
// 将BigDecimal对象中的值转换成字符串