文章目录
- BigDecimal
- 1.0BigDecimal减法
- 1.1 BigDecimal除法
- 1.2 BigDecimal累加
- 1.3 BigDecimal转为double,并累加
- Bigdecimal转Double并四舍五入保留两位小数
- 1.4 BigDecimalFormat使用
- 1.5 BigDecimal转为String
- BigDecimal转为String展示
- 1.6 小数点处理setScale:https://blog.csdn.net/ahwr24/article/details/7048724
- 1.7 比较大小
BigDecimal
https://blog.csdn.net/qq_35539512/article/details/79484044?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link
1.0BigDecimal减法
public static BigDecimal safeSubtract(BigDecimal num1, BigDecimal num2) {if (num1 == null) {num1 = BigDecimal.ZERO;}if (num2 == null) {num2 = BigDecimal.ZERO;}return num1.subtract(num2);}
1.1 BigDecimal除法
踩坑:divide整出除不尽问题
BigDecimal b1 = new BigDecimal(1);
BigDecimal b2 = new BigDecimal(3);
BigDecimal divide1 = b1.divide(b2, 3, RoundingMode.DOWN);
System.out.println(divide1);
1.2 BigDecimal累加
add踩坑
对DO中属性priority进行累加
BigDecimal priorityTotal = doList.stream().map(DO::getPriority).reduce(BigDecimal.ZERO, BigDecimal::add);
对集合中DTO类中saleCount属性值进行累加,获取GMV
BigDecimal gmv = BigDecimal.ZERO;
for (DTO dto : dtoList) {gmv = gmv.add(sellOutWarnSkuDTO.getSaleCount());
}
1.3 BigDecimal转为double,并累加
dtoList.stream().mapToDouble(dto -> DTO.getSalePcs().doubleValue()).sum();
Bigdecimal转Double并四舍五入保留两位小数
public static Double bigDecimal2double2Reserve(BigDecimal bigDecimal) {return bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();}
1.4 BigDecimalFormat使用
public static void main(String[]args){double pi = 3.1415927; //圆周率//取一位整数System.out.println(new DecimalFormat("0").format(pi)); //3//取一位整数和两位小数System.out.println(new DecimalFormat("0.00").format(pi)); //3.14//取两位整数和三位小数,整数不足部分以0填补。System.out.println(new DecimalFormat("00.000").format(pi));// 03.142//取所有整数部分System.out.println(new DecimalFormat("#").format(pi)); //3//以百分比方式计数,并取两位小数System.out.println(new DecimalFormat("#.##%").format(pi)); //314.16%long c =299792458; //光速//显示为科学计数法,并取五位小数System.out.println(new DecimalFormat("#.#####E0").format(c)); //2.99792E8//显示为两位整数的科学计数法,并取四位小数System.out.println(new DecimalFormat("00.####E0").format(c)); //29.9792E7//每三位以逗号进行分隔。System.out.println(new DecimalFormat(",###").format(c)); //299,792,458//将格式嵌入文本System.out.println(new DecimalFormat("光速大小为每秒,###米。").format(c));}
1.5 BigDecimal转为String
BigDecimal gmv = xxxxx;
DecimalFormat format = new DecimalFormat("这里的pattern格式可以参考1.4中的BigDecimalFormat使用");
String s = format.format(gmv);
BigDecimal转为String展示
- 最好不要用doble展示,因为可能出现科学计算法的展示形式1.6E
- 补充:可以参考1.4 BigDecimalFormat使用
不要科学计算法,且不要无用的小数位
BigDecimal pcs = BigDecimal.valueOf(5454545453.1415926);String plainString = pcs.stripTrailingZeros().toPlainString();
BigDecimal decimal = new BigDecimal(123456789.2345);double doubleValue = decimal.doubleValue();String res = decimal.stripTrailingZeros().toPlainString();System.out.println(decimal);System.out.println(doubleValue);System.out.println(res);
123456789.23450000584125518798828125
1.234567892345E8
123456789.23450000584125518798828125//保留两位小数BigDecimal newBigDecimal = decimal.setScale(2, BigDecimal.ROUND_HALF_UP);double newDoubleValue = newBigDecimal.doubleValue();String newRes = newBigDecimal.stripTrailingZeros().toPlainString();System.out.println(newBigDecimal);System.out.println(newDoubleValue);System.out.println(newRes);
123456789.23
1.2345678923E8
123456789.23
1.6 小数点处理setScale:https://blog.csdn.net/ahwr24/article/details/7048724
1.7 比较大小
【强制】 BigDecimal需要使用compareTo()
因为BigDecimal的equals()还会比对精度,2.0与2.00不一致。