1、BigDecimal(String val)和BigDecimal(double val)的精度问题。
public class BigDecimalTest01 {
public static void main(String[] args) {
BigDecimal big = new BigDecimal(0.1);
System.out.println("BigDecimal创建的double值为"+big);
BigDecimal big2 = new BigDecimal("0.1");
System.out.println("BigDecimal创建的String值为"+big2);
}
}
BigDecimal创建的double值为0.1000000000000000055511151231257827021181583404541015625
BigDecimal创建的String值为0.1
0.1无法准确的表示为double,所以传到构造方法的值不会正好是0.1,表示准确预期数字时,建议使用String构造方法。
若必须传入double类型的数值时,先使用Double.toString(double)方法,再使用BigDecimal(String)构造方法。转换为String传入。
2、BigDecimal比较大小
利用BigDecimal中的compareTo()方法,返回1表示大于,返回0表示相等,返回-1表示小于
BigDecimal big3 = new BigDecimal("0.2");
System.out.println(big3.compareTo(big2));
输出为1,表示当前数大于传过去的数。
3、常用的方法:
add(BigDecimal augend)加
subtract(BigDecimal subtrahend)减
multiply(BigDecimal multiplicand)乘
divide(BigDecimal divisor)除
doubleValue()
将此 BigDecimal 转换为 double。
floatValue()
将此 BigDecimal 转换为 float。
longValue()
将此 BigDecimal 转换为 long。
intValue()
将此 BigDecimal 转换为 int。
4、BigDecimal的一些静态方法,
static int | ROUND_CEILING 接近正无穷大的舍入模式。 |
static int | ROUND_DOWN 接近零的舍入模式。 |
static int | ROUND_FLOOR 接近负无穷大的舍入模式。 |
static int | ROUND_HALF_DOWN 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。 |
static int | ROUND_HALF_EVEN 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。 |
static int | ROUND_HALF_UP 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。 |
static int | ROUND_UNNECESSARY 请求的操作具有精确的结果,因此不需要舍入。 |
5、BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。因此,BigDecimal 表示的数值是 (unscaledValue × 10-scale)。
6、注意:BigDecimal都是不可变的,在进行每一次四则运算的时候,都会产生一个新的对象,记得保存四则运算后的值。