BigDecimal 是 Java 编程语言中的一个类,属于 java.math
包,用于高精度的十进制数计算。
BigDecimal 在金融领域、货币计算、税务计算、精确计算需求以及其他需要保持精度和执行准确计算的场景中广泛应用。
BigDecimal 对象是
不可变的
,这意味着一旦创建就不能修改其值,每个操作都会产生一个新的 BigDecimal 对象作为结果,在执行计算时需要更多的内存,因此在大量计算或对性能要求较高的情况下,需要权衡使用 BigDecimal 的优势和劣势。
精度问题
因为用 浮点数
转换会 丢失精度
,所以最好使用 字符串
或 整数
来初始化 BigDecimal 对象。
BigDecimal bigDecimal = new BigDecimal(0.11);
System.out.println(bigDecimal);
// 输出结果
// 0.11000000000000000055511151231257827021181583404541015625
还有就是在做 除法
的时候,如果 不指定精度
会抛异常:
BigDecimal bigDecimal2 = new BigDecimal("10");
BigDecimal bigDecimal = new BigDecimal("3");
// 异常
// System.out.println(bigDecimal2.divide(bigDecimal));
System.out.println(bigDecimal2.divide(bigDecimal, 2, BigDecimal.ROUND_HALF_UP));
去掉多余零
BigDecimal bigDecimal1 = new BigDecimal("199.100");
System.out.println(bigDecimal1);
System.out.println(bigDecimal1.stripTrailingZeros());
//输出
// 199.100
// 199.1
compareTo 和 equals
-
equals:判断是不是同一个对象,如果不是同一个对象,还会判断值和小数位是不是相同。
例如:123.0 和 123.00 是不相等的。
-
compareTo:只会判断值和小数位是不是相同。
例如:123.0 和 123.00 是相等的。
compareTo 的返回值:
- 1:当第一个 BigDecimal 大于 第二个 BigDecimal 时。
- 0:当第一个 BigDecimal 等于 第二个 BigDecimal 时。
- -1:当第一个 BigDecimal 小于 第二个 BigDecimal 时。
Integer
Integer 默认会缓存 -128~127 之间的数,所以下面这种判断返回的是 true:
Integer a = 100;
Integer b = 100;
System.out.println(a == b);
超过缓存值,就会创建新的 Integer 实例,所以必须使用 :
Integer a = 1000;
Integer b = 1000;
System.out.println(a.equals(b));