java api 的使用

一、BigDecimal 精确计算

1.1 浮点数精度问题演示

1
2
// 浮点数运算存在精度丢失问题
System.out.println(1.01 + 2.02); // 输出:3.0300000000000002

1.2 BigDecimal 基础用法

1
2
3
4
5
6
7
8
9
10
11
12
// 推荐使用字符串构造或 valueOf 方法初始化(避免double传参)
BigDecimal one = new BigDecimal("1.01"); // 精确构造
BigDecimal two = BigDecimal.valueOf(2.02); // 自动优化数值转换

// 常规算术运算
System.out.println(one.add(two)); // 加法:3.03
System.out.println(one.subtract(two)); // 减法:-1.01
System.out.println(one.multiply(two)); // 乘法:2.0402

// 除法运算(必须指定精度控制)
System.out.println(one.divide(two, RoundingMode.HALF_UP)); // 默认精度
System.out.println(bd1.divide(bd2, 10, RoundingMode.FLOOR)); // 指定10位小数+舍入模式

1.3 精度控制与比较

1
2
3
4
5
6
// 小数位数控制
BigDecimal value = BigDecimal.valueOf(1.3543242342342);
System.out.println(value.setScale(4, RoundingMode.HALF_UP)); // 四舍五入保留4位:1.3543

// 数值比较(推荐使用 compareTo)
System.out.println(value.compareTo(BigDecimal.ZERO)); // 返回1(大于0)

二、安全随机数生成

2.1 基础随机数生成

1
2
3
4
5
6
// 无边界随机数
int fullRangeInt = ThreadLocalRandom.current().nextInt();
long fullRangeLong = ThreadLocalRandom.current().nextLong();

// [0.0, 1.0) 随机浮点数
double unitDouble = ThreadLocalRandom.current().nextDouble();

2.2 范围约束生成

1
2
3
4
5
6
7
8
9
10
11
12
// 生成 [0, 100) 随机整数
int rangeInt = ThreadLocalRandom.current().nextInt(0, 100);

// 生成 [0, 10] 闭合区间随机整数(包含上限)
int closedRange = ThreadLocalRandom.current().nextInt(0, 10 + 1);

// 生成 [0.01, 100.0) 随机浮点数
double rangeDouble = ThreadLocalRandom.current().nextDouble(0.01, 100.0);

// 格式化随机浮点数(保留两位小数)
BigDecimal formatted = BigDecimal.valueOf(rangeDouble)
.setScale(2, RoundingMode.HALF_UP);