bigDecimal
409字约1分钟
2024-08-08
和 BigInteger
类似,BigDecimal
可以表示一个任意大小且精度完全准确的浮点数,BigDecimal
也是从 Number
继承的,也是不可变对象
BigDecimal bd = new BigDecimal("123.4567");
使用
BigDecimal
用 scale()
表示小数位数
BigDecimal d1 = new BigDecimal("123.45");
BigDecimal d2 = new BigDecimal("123.4500");
BigDecimal d3 = new BigDecimal("1234500");
System.out.println(d1.scale()); // 2,两位小数
System.out.println(d2.scale()); // 4
System.out.println(d3.scale()); // 0
通过 BigDecimal
的 stripTrailingZeros()
方法,可以将一个 BigDecimal
格式化为一个相等的,但去掉了末尾 0
的 BigDecimal
如果一个 BigDecimal
的 scale()
返回负数,例如,-2
,表示这个数是个整数,并且末尾有 2
个 0
BigDecimal d1 = new BigDecimal("123.4500");
BigDecimal d2 = d1.stripTrailingZeros();
System.out.println(d1.scale()); // 4
System.out.println(d2.scale()); // 2,因为去掉了00
BigDecimal d3 = new BigDecimal("1234500");
BigDecimal d4 = d3.stripTrailingZeros();
System.out.println(d3.scale()); // 0
System.out.println(d4.scale()); // -2
可以对一个 BigDecimal
设置它的 scale
,如果精度比原始值低,那么按照指定的方法进行四舍五入或者直接截断
public static void main(String[] args) {
BigDecimal d1 = new BigDecimal("123.456789");
BigDecimal d2 = d1.setScale(4, RoundingMode.HALF_UP); // 四舍五入
BigDecimal d3 = d1.setScale(4, RoundingMode.DOWN); // 直接截断
System.out.println(d2); // 123.4568
System.out.println(d3); // 123.4567
}
对 BigDecimal
做加、减、乘时,精度不会丢失,但是做除法时,存在无法除尽的情况,这时,就必须指定精度以及如何进行截断
BigDecimal d1 = new BigDecimal("123.456");
BigDecimal d2 = new BigDecimal("23.456789");
BigDecimal d3 = d1.divide(d2, 10, RoundingMode.HALF_UP); // 保留10位小数并四舍五入
BigDecimal d4 = d1.divide(d2); // 报错:ArithmeticException,因为除不尽
比较 BigDecimal
必须使用 compareTo()
方法来比较,它根据两个值的大小分别返回 -1
、1
和 0
-1
小于0
等于1
大于