目次
一、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.88
- DecimalFormat 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.88300
- DecimalFormat 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次方
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |