一、构造函数
下面介绍几种常用的BigDecimal的构造函数示例和注意事项,代码如下:
/**
* BigDecimal 构造函数
*
* @param args
*/
public static void main(String[] args) {
// 1.int:创建一个具体参数所指定 整数值的 BigDecimal 对象
BigDecimal intBigDecimal= new BigDecimal(2);
System.out.println("intBigDecimal = " + intBigDecimal);
// 2.String:创建一个具有参数所指定以 字符串 表示的BigDecimal对象
BigDecimal stringBigDecimal = new BigDecimal("2");
System.out.println("stringBigDecimal = " + stringBigDecimal);
// 3.long:创建一个具有参数所指定的 长整数的 BgiDecimal对象
BigDecimal longBigDecimal = new BigDecimal(2L);
System.out.println("longBigDecimal = " + longBigDecimal);
// 4.double:创建一个具有参数所指定 双精度值的 BigDecimal 对象
BigDecimal doubleBigDecimal = new BigDecimal(0.2);
System.out.println("doubleBigDecimal = " + doubleBigDecimal);
}
结果
现象
常用的BIgDecimal构造函数中,当传入double类型的作为入参,其结果是有误的
原因
参数类型为double的构造方法的结果具有一定的不可预知性。就像上面的程序表示的那样,虽然new BigDecimal(0.2)所创建的Bigdecimal是0.2,但是实际上得到的值确是不同的,因为0.2无法准确地表示为double,所以传入构造方法的值也就出现了误差。
建议
当使用double类型创建BigDecimal对象给的时候,可能会出现精度误差,不建议使用,如果非要使用double类型的作为入参,建议先转换为String,如下所示
/**
* BigDecimal 构造函数
*
* @param args
*/
public static void main(String[] args) {
// 1.int:创建一个具体参数所指定 整数值的 BigDecimal 对象
BigDecimal intBigDecimal= new BigDecimal(2);
System.out.println("intBigDecimal = " + intBigDecimal);
// 2.String:创建一个具有参数所指定以 字符串 表示的BigDecimal对象
BigDecimal stringBigDecimal = new BigDecimal("2");
System.out.println("stringBigDecimal = " + stringBigDecimal);
// 3.long:创建一个具有参数所指定的 长整数的 BgiDecimal对象
BigDecimal longBigDecimal = new BigDecimal(2L);
System.out.println("longBigDecimal = " + longBigDecimal);
// 4.double:创建一个具有参数所指定 双精度值的 BigDecimal 对象
BigDecimal doubleBigDecimal = new BigDecimal(0.2);
System.out.println("doubleBigDecimal = " + doubleBigDecimal);
// 5、double:先转为String,再创建BigDecimal对象
BigDecimal doubleToStringBigDecimal = new BigDecimal(String.valueOf(0.2));
System.out.println("doubleToStringBigDecimal = " + doubleToStringBigDecimal);
}
二、加减乘除
/**
* BigDecimal 加减乘除
*
* @param args
*/
public static void main(String[] args) {
// 定义两个变量 num1 = 1,num2 = 10
BigDecimal num1 = new BigDecimal("2");
BigDecimal num2 = new BigDecimal("10");
// 相加
BigDecimal add = num1.add(num2);
System.out.println("相加后的结果 = " + add);
// 想减
BigDecimal subtract = num1.subtract(num2);
System.out.println("相减后的结果 = " + subtract);
// 相乘
BigDecimal multiply = num1.multiply(num2);
System.out.println("相乘后的结果 = " + multiply);
// 相除
BigDecimal divide = num1.divide(num2);
System.out.println("相除后的结果 = " + divide);
}
三、比较大小
两个BigDecimal引用对象比较后再与0相比较
/**
* BigDecimal 比较大小
*
* @param args
*/
public static void main(String[] args) {
// 定义两个变量 num1 = 1,num2 = 10
BigDecimal num1 = new BigDecimal("2");
BigDecimal num2 = new BigDecimal("10");
/**
* 比较好的结果
* i > 0 则 num1 > num2
* i = 0 则 num1 = num2
* i < 0 则 num1 < num2
*/
int i = num1.compareTo(num2);
System.out.println("请问num1比num2大是正确的吗:" + (i > 0 ? "正确" : "错误"));
}
四、精度问题
RoundingMode.DOWN
/**
* BigDecimal 进度问题
*
* @param args
*/
public static void main(String[] args) {
// 定义原来的一个数字 num = 3.14159
BigDecimal num = new BigDecimal("3.14159");
System.out.println("原来的数字为 = " + num);
// 1.RoundingMode.DOWN 保留3位小数,直接删除多余的小数位,结果位3.141
BigDecimal bigDecimal = num.setScale(3, RoundingMode.DOWN);
System.out.println("bigDecimal = " + bigDecimal);
}
RoundingMode.UP
/**
* BigDecimal 进度问题
*
* @param args
*/
public static void main(String[] args) {
// 定义原来的一个数字 num = 3.14159
BigDecimal num = new BigDecimal("3.14159");
System.out.println("原来的数字为 = " + num);
// RoundingMode.UP 保留3位小数,进位处理,四舍五入,结果位3.142
BigDecimal bigDecimal = num.setScale(3, RoundingMode.UP);
System.out.println("bigDecimal = " + bigDecimal);
}
RoundingMode.HALF_UP
/**
* BigDecimal 进度问题
*
* @param args
*/
public static void main(String[] args) {
// 定义原来的一个数字 num = 3.14159
BigDecimal num = new BigDecimal("3.14159");
System.out.println("原来的数字为 = " + num);
// RoundingMode.HALF_UP 保留3位小数,四舍五入,结果位3.142
BigDecimal bigDecimal = num.setScale(3, RoundingMode.HALF_UP);
System.out.println("bigDecimal = " + bigDecimal);
}
RoundingMode.HALF_DOWN
/**
* BigDecimal 进度问题
*
* @param args
*/
public static void main(String[] args) {
// 定义原来的一个数字 num = 2.35
BigDecimal num = new BigDecimal("2.35");
System.out.println("原来的数字为 = " + num);
// RoundingMode.HALF_DOWN 保留1位小数,如果是5则向下舍,结果位2.3
BigDecimal bigDecimal = num.setScale(1, RoundingMode.HALF_DOWN);
System.out.println("bigDecimal = " + bigDecimal);
// RoundingMode.HALF_DOWN 保留1位小数,如果超过5则向上入,结果位2.4
BigDecimal num1 = new BigDecimal("2.36");
BigDecimal bigDecimal1 = num1.setScale(1, RoundingMode.HALF_DOWN);
System.out.println("bigDecimal1 = " + bigDecimal1);
}
五、总结
希望能帮助到大家,谢谢!