目录
一、Math类
二、BigDecimal
三、BigInteger
四、DecimalFormat数字格式化
一、Math类
// 自然指数
System.out.println(Math.E); // 2.718281828459045
// 圆周率
System.out.println(Math.PI); // 3.141592653589793// 求绝对值
System.out.println(Math.abs(-3)); // 3
// 求立方根
System.out.println(Math.cbrt(27)); // 3.0
// 向上取整
System.out.println(Math.ceil(-3.4)); // -3.0
// 向下取整
System.out.println(Math.floor(-3.7)); // -4.0
// 四舍五入
System.out.println(Math.round(3.57)); // 4// 最大值
System.out.println(Math.max(10,20)); // 20
// 最小值
System.out.println(Math.min(10,20)); // 10
// 加权函数 a的b次方
System.out.println(Math.pow(2,10)); // 1024.0
// 随机数 [0,1)
System.out.println(Math.random()); // 0.5776188237170176
// 平方根
System.out.println(Math.sqrt(16)); // 4.0
二、BigDecimal
需要精确计算时(财务、金融),要求参数以字符串形式传递,底层使用按位运算。
double b = 3.14;
double b1 = 5.0;
// 无限循环小数和无限不循环小数无法存储,没办法精确表示小数 (10/3.0)
// 默认java中无法精确计算
System.out.println(b1 - b); // 1.8599999999999999
System.out.println(String.format("%.2f", b1 - b)); // 1.86
NaN:判断是否是非数字
double b = 3.14;
System.out.println(Double.isNaN(d1));
BigDecimal用于计算精确的类,传入的值应当是字符串,如果使用数字(如 double、float、long)来创建BigDecimal实例时,这些数字首先会按照它们各自的数据类型进行处理,然后转换为 BigDecimal。
但是,由于double和float是基于IEEE 754标准的浮点数表示,它们不能精确表示所有的小数,尤其是那些无限循环或非常长的小数。因此,使用double或float构造BigDecimal时,可能会遇到精度丢失的问题。
BigDecimal bigDecimal = new BigDecimal(2.0);
BigDecimal bigDecimal2 = new BigDecimal(1.99);
System.out.println(bigDecimal.subtract(bigDecimal2));// 0.0100000000000000088817841970012523233890533447265625
使用字符串(String)来构造BigDecimal实例时,可以避免由于浮点数表示不准确而带来的精度问题。字符串表示的小数在转换为BigDecimal时,会按照字符串中的精确值来构造,不会有任何精度的丢失。
BigDecimal bigDecimal3 = new BigDecimal("3.0");
BigDecimal bigDecimal4 = new BigDecimal("1.5");// 差法
System.out.println("差:" + bigDecimal3.subtract(bigDecimal4));
// 加法
System.out.println("加:" + bigDecimal3.add(bigDecimal4));
// 乘法
System.out.println("乘:" + bigDecimal3.multiply(bigDecimal4));
// 除法
System.out.println("除:" + bigDecimal3.divide(bigDecimal4));
// 如果除不尽会报错:
Exception in thread "main" java.lang.ArithmeticException:
Non-terminating decimal expansion; no exact representable decimal result.at java.base/java.math.BigDecimal.divide(BigDecimal.java:1736)
三、BigInteger
BigInteger 用于存储和计算非常大的整数。
// 大十进制 大量数字的存储和计算
BigInteger bigInteger1 = new BigInteger("149257915");
BigInteger bigInteger2 = new BigInteger("4179127477");
System.out.println(bigInteger1.multiply(bigInteger2));
四、DecimalFormat数字格式化
double d = 73.98 * 0.85;
System.out.println(d); // 62.883
使用DecimalFormat可以指定数据的显示格式,DecimalFormat.format()方法可以进行四舍五入,用0代表占位,表示一位数字。如果没有数字,用0代替。
// 四舍五入
DecimalFormat decimalFormat = new DecimalFormat("0.00");
System.out.println(decimalFormat.format(d)); // 62.88DecimalFormat decimalFormat1 = new DecimalFormat("0.0");
System.out.println(decimalFormat1.format(d)); // 62.9// 用0补位
DecimalFormat decimalFormat2 = new DecimalFormat("0.00000");
System.out.println(decimalFormat2.format(d)); // 62.88300DecimalFormat decimalFormat3 = new DecimalFormat("000.00000");
System.out.println(decimalFormat3.format(d)); // 062.88300// # 代表占位,表示一位数字。如果这一位没有数字,那么就不填充
// 0.#0 明显不符合常识,不能使用
double d1 = 10.09 * 0.85;
DecimalFormat decimalFormat4 = new DecimalFormat("#0.00");
System.out.println(decimalFormat4.format(d1)); // 8.58// 科学计数法
DecimalFormat decimalFormat5 = new DecimalFormat("0.00E0");
System.out.println(decimalFormat5.format(d1)); // 8.58E0 表示8.58乘以10的1次方DecimalFormat decimalFormat6 = new DecimalFormat("0.000E0");
System.out.println(decimalFormat6.format(d1)); // 8.508E0 表示8.508乘以10的1次方