数学类
数学类没什么难点,只需要记住相关方法即可
Math
// 圆周率
System.out.println(Math.PI);
// 自然指数
System.out.println(Math.E);
// 绝对值
System.out.println(Math.abs(-10));
// 立方根
System.out.println(Math.cbrt(27));
// 平方根
System.out.println(Math.sqrt(9));
// 向上取整
System.out.println(Math.ceil(3.74));
// 向下取整
System.out.println(Math.floor(-3.4));
// 加权函数a的b次方
System.out.println(Math.pow(3,4));
// 获取随机数 [100000,1000000)
System.out.println(Math.random());
// 四舍五入
System.out.println(Math.round(3.5));
BigDecimal
- BigDecimal是用于精确计算的类,其内部包含两种数据类型来表示一个数值
BigInteger:用于存储数值的整数部分(即非指数部分),它可以表示任意大小的整数,很适合用来存储大数值
int:用于存储数值的小数点位置,也就是scale(标度),scale表示的是小数点后面的有效零的个数。例如123.45有两位小数,它的标度就为2
这个数组用来保存小数部分,每个元素都是BigDecimal的对象,其中第一个参数是value,他的范围是0到10
第二个参数scale表示标度,即小数的位数,由于这个数组仅存储整数部分,所以scale全部是0
第三个参数precision表示精度,即数值的总位数,整数0-9时precision都为1,而10则为2
这么做可以将常用的BigDecimal对象预存到一个数组中,减少程序运行时对相同的BigDecimal对象的创建次数,同时这么做还能在代码中直接引用,而不需要重新创建对象,提高了代码的运行效率和简洁性
这个数组用来保存小数部分,其中第一个参数是 BigInteger.ZERO,表示整数部分为0
第三个参数是value,它始终为0,因为对于小数部分而言整数部分都是0
第三个参数是scale,表示小数点后的位数,它可以是1到15,也就是最多可以精确到小数点后15位
第四个参数是precision,表示精度,即数值的总位数,由于整数部分为0,这里的精度始终为1,只有小数部分的一位
值得注意的是,其中0、1、2、10这四个数来自Math中的BigInteger类
调用BigDecimal类时,需要传入字符串数据进行运算:
BigDecimal bigDecimal = new BigDecimal("3.0");
BigDecimal bigDecimal1 = new BigDecimal("2.0");
// 加法
System.out.println(bigDecimal.add(bigDecimal1));
// 减法
System.out.println(bigDecimal.subtract(bigDecimal1));
// 乘法
System.out.println(bigDecimal.multiply(bigDecimal1));
// 除法 要求能够获取精确结果
System.out.println(bigDecimal.divide(bigDecimal1));
BigInteger
这个类用来处理那些超过了基本整数类型,如int或long所能表示的最大值。普遍应用于加密算法或者财务计算等需要大额数值的场景,他的位数理论上是不设限的,取决于计算机的内存大小,但过高的位数会导致程序运行效率降低
使用BigInteger完成乘法运算示例:
BigInteger bigInteger1 = new BigInteger("987654334326756");
BigInteger bigInteger2 = new BigInteger("98765435");
System.out.println(bigInteger1.multiply(bigInteger2));
DecimalFormat
DecimalFormat提供了格式化和解析数字字符串的方法,DecimalFormat是NumberFormat的子类,允许对数字格式化有更多的控制,比如指定小数点后的位数、使用千位分隔符、货币符号等
以下是常用模式字符:
0
表示一个数字,包括前导零。
#
表示一个数字,不包括前导零。
.
表示小数点。
,
表示千位分隔符。
E
或 e
表示指数记号。
%
表示百分比,即乘以 100 后加上 % 符号。
;
用于分隔正数和负数的格式模式。
-
表示负号。
( )
表示负数的括号。
以下是基本使用示例,我使用注释进行介绍:
double d = 12345.678;
// 创建对象指定数字显示的格式
// 0代表占位符,表示一位数字,如果这一位没有数字,用0填充
DecimalFormat decimalFormat1 = new DecimalFormat("00000.0000");
System.out.println(decimalFormat1.format(d)); //结果:12345.6780
DecimalFormat decimalFormat2 = new DecimalFormat("####0.0###");
// #是一个占位符,表示一位数字,这一位如果没有数字,那么就不填充内容
System.out.println(decimalFormat2.format(d)); //结果:12345.678
String s = "1,234,567.89";
//格式化数字字符串
DecimalFormat decimalFormat3 = new DecimalFormat("#,#.#");
Number number = decimalFormat3.parse(s);
System.out.println(number.doubleValue()); //结果:1234567.89
double d2 = 567546436546342L;
// 科学计数法
DecimalFormat decimalFormat4 = new DecimalFormat("0.00E0");
System.out.println(decimalFormat4.format(d2)); //结果:5.68E14
d = 1234567.89;
//自定义数字的格式符号,例如千分位符和小数点符号
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(' ');
symbols.setDecimalSeparator(',');
//作为参照
DecimalFormat decimalFormat5 = new DecimalFormat("###,###.##");
DecimalFormat decimalFormat6 = new DecimalFormat("###,###.##", symbols);
System.out.println(decimalFormat5.format(d)); //结果:1,234,567.89
System.out.println(decimalFormat6.format(d)); //结果:1 234 567,89
思考:两个千位数字相乘,有几种方案?最高效的是?