不精确的情况:
public class BigDecimalDemo1 {
public static void main(String[] args) {
System.out.println(0.09 + 0.01); // 0.09999999999999999
System.out.println(0.216 - 0.1); // 0.11599999999999999
System.out.println(0.226 * 0.01); // 0.0022600000000000003
System.out.println(0.09 / 0.1); // 0.8999999999999999
}
}
BigDecimal 所在的包: java.math
程序示例:
public class demo2 {
public static void main(String[] args) {
/*
构造方法获取BigDecimal对象
public BigDecimal(double val) public BigDecimal(string val)
静态方法获取BigDecimal对象
public static BigDecimal valuef(double val)
*/
// 1.通过传递double类型的小数来创建对象
// 细节:
// 这种方式有可能是不精确的, 所以不建议使用
BigDecimal bd1 = new BigDecimal(0.01);
BigDecimal bd2 = new BigDecimal(0.09);
System.out.println(bd1); // 0.01000000000000000020816681711721685132943093776702880859375
System.out.println(bd2); // 0.0899999999999999966693309261245303787291049957275390625
// 通过传递字符串表示的小数来创建对象
BigDecimal bd3 = new BigDecimal("0.01");
BigDecimal bd4 = new BigDecimal("0.09");
BigDecimal bd5 = bd3.add(bd4);
System.out.println(bd3); // 0.01
System.out.println(bd4); // 0.09
System.out.println(bd5); // 0.10
}
}
程序示例:
public class demo2 {
public static void main(String[] args) {
/*
构造方法获取BigDecimal对象
public BigDecimal(double val) public BigDecimal(string val)
静态方法获取BigDecimal对象
public static BigDecimal valuef(double val)
*/
// 3.通过静态方法获取对象
// 细节:
// 1.如果要表示的数字不大, 没有超出double的取值范围, 建议使用静态方法
// 2.如果要表示的数字比较大, 超出了double的取值范围, 建议使用构造方法
// 3.如果我们传递的是0~10之间的整数, 包含0, 包含10, 那么方法会返回已经创建好的对象, 不会重新new
BigDecimal bd6 = BigDecimal.valueOf(10.0);
BigDecimal bd7 = BigDecimal.valueOf(10.0);
System.out.println(bd6 == bd7); // false
BigDecimal bd66 = BigDecimal.valueOf(10);
BigDecimal bd77 = BigDecimal.valueOf(10);
System.out.println(bd66 == bd77); // true
}
}
参数为 double 的 valueOf() 方法:
参数为 long 的 valueOf() 方法:
查看 ZERO_THROUGH_TEN 数组:
BigDecimal 的成员方法:
程序示例:
import java.math.BigDecimal;
import java.math.RoundingMode;
public class demo3 {
public static void main(String[] args) {
/*
public BigDecimal add(BigDecimal val) 加法
public BigDecimal subtract(BigDecimal val) 减法
public BigDecimal multiply(BigDecimal val) 乘法
public BigDecimal divide(BigDecimal val) 除法
public BigDecimal divide(BigDecimal val, 精确几位, 舍入模式)除法
*/
// 1.加法
BigDecimal bd1 = BigDecimal.valueOf(10.);
BigDecimal bd2 = BigDecimal.valueOf(3.0);
BigDecimal bd3 = bd1.add(bd2);
System.out.println(bd3); // 12.0
// 2.减法
BigDecimal bd4 = bd1.subtract(bd2);
System.out.println(bd4); // 8.0
// 3.乘法
BigDecimal bd5 = bd1.multiply(bd2);
System.out.println(bd5); // 20.00
// 4.除法
BigDecimal bd6 = bd1.divide(bd2, 2, RoundingMode.HALF_UP); // 四舍五入
BigDecimal bd7 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);
System.out.println(bd6); // 3.33
System.out.println(bd7); // 3.33
}
}
用打断点的方式查看:
public class demo4 {
public static void main(String[] args) {
BigDecimal bd1 = BigDecimal.valueOf(0.226);
BigDecimal bd2 = BigDecimal.valueOf(123.226);
BigDecimal bd3 = BigDecimal.valueOf(-1.5);
}
}
注意这些数组是 byte 类型的.
BigDecimal 也是有上限的. 但是实际电脑内存是不可能达到这么大的值的, 所以可以认为是无限大的.
标签:BigDecimal,valueOf,System,println,public,out From: https://www.cnblogs.com/Chengkai730/p/18548814