BigDecimal 是 Java 中用于高精度计算的类,属于 java.math 包。它主要用于处理需要极高精度的数值运算。
记住:在金融计算、价格计算等需要精确小数运算的场景中,BigDecimal 是唯一正确的选择。
double result = 0.1 + 0.2; // 结果为 0.30000000000000004
float a = 1;
float b = 0.9f;
System.out.println(a - b); // 结果为 0.100000024
当程序中涉及到金额时,必须使用 BigDecimal 而不是 double 或 float 。
double result = 0.1 + 0.2; // 结果为 0.30000000000000004
BigDecimal bd1 = new BigDecimal("0.1");
BigDecimal bd2 = new BigDecimal("0.2");
BigDecimal sum = bd1.add(bd2); // 结果为 0.3
BigDecimal b_int = new BigDecimal(10);
BigDecimal b_double = new BigDecimal(0.1);
BigDecimal b_float = new BigDecimal(0.1f);
BigDecimal b_string = new BigDecimal("0.1");
BigDecimal b_valueof = BigDecimal.valueOf(0.1);
System.out.println("b_int:" + b_int); // b_int:10
System.out.println("b_double:" + b_double); // b_double:0.1000000000000000055511151231257827021181583404541015625
System.out.println("b_float:" + b_float); // b_float:0.100000001490116119384765625
System.out.println("b_string:" + b_string); // b_string:0.1
System.out.println("b_valueof:" + b_valueof); // b_valueof:0.1
使用构造函数时,推荐用 int 或 String 做参数,如果不满足,则建议使用 BigDecimal.valueOf 方法,该方法可接受 int、long、double、float 做参数,但注意不接受 String。
BigDecimal a = new BigDecimal("10.50");
BigDecimal b = new BigDecimal("3.20");
BigDecimal sum = a.add(b); // 13.70
BigDecimal a = new BigDecimal("10.50");
BigDecimal b = new BigDecimal("3.20");
BigDecimal difference = a.subtract(b); // 7.30
BigDecimal a = new BigDecimal("10.50");
BigDecimal b = new BigDecimal("3.20");
BigDecimal product = a.multiply(b); // 33.600
BigDecimal a = new BigDecimal("10.50");
BigDecimal b = new BigDecimal("3.20");
// 四舍五入保留2位小数
BigDecimal quotient1 = a.divide(b, 2, RoundingMode.HALF_UP); // 3.28
// 使用默认舍入模式
BigDecimal quotient2 = a.divide(b, RoundingMode.HALF_UP);
BigDecimal a = new BigDecimal("10.5");
BigDecimal b = new BigDecimal("3.2");
BigDecimal remainder = a.remainder(b); // 0.9
BigDecimal a = new BigDecimal("10.5");
BigDecimal b = new BigDecimal("3.2");
BigDecimal[] results = a.divideAndRemainder(b);
// results[0] = 3 (商)
// results[1] = 0.9 (余数)
BigDecimal a = new BigDecimal("-10.50");
BigDecimal absolute = a.abs(); // 10.50
BigDecimal a = new BigDecimal("2.5");
BigDecimal power = a.pow(3); // 15.625
BigDecimal a = new BigDecimal("3.1415926");
// 四舍五入保留3位小数
BigDecimal rounded = a.setScale(3, RoundingMode.HALF_UP); // 3.142
// 直接截断
BigDecimal truncated = a.setScale(3, RoundingMode.DOWN); // 3.141
BigDecimal a = new BigDecimal("10.50");
BigDecimal b = new BigDecimal("10.5");
int result = a.compareTo(b);
// result = 0 (相等)
// result < 0 (a < b)
// result > 0 (a > b)
问题:两数相除,如果9/3=3整除没问题,但是10/3=0.33333333…除不尽,这里不能让电脑一直除不尽,所以BigDecimal做出一些限制;
必须按照(数,保留小数位(最好要合理限制最大精度),舍入方式)来操作,否则就会抛出异常,例如:
public static void main(String[] args) {
BigDecimal a = new BigDecimal(10);
BigDecimal b = new BigDecimal(3);
BigDecimal c = a.divide(b);
}
执行:抛出
Exception in thread “main” java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1616)
// java.lang.NumberFormatException
BigDecimal val = new BigDecimal("a");
System.out.println(val);
BigDecimal x = new BigDecimal("1.0");
BigDecimal y = new BigDecimal("1.00");
System.out.println(x.equals(y)); //false 尽管 1.0 和 1.00 的数值相等,但精度不一样,equals 判定为不同。