一、Math 类
java.lang.Math
类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单。
属性
属性名称 | 属性描述 |
---|---|
public static final double PI | 返回圆周率 |
方法
方法名称 | 方法描述 |
---|---|
public static double abs(double a) | 返回 double 值的绝对值 |
public static double ceil(double a) | 返回大于等于参数的最小的整数。 |
public static double floor(double a) | 返回小于等于参数最大的整数。 |
public static long round(double a) | 返回最接近参数的 long。(相当于四舍五入方法) |
public static double pow(double a,double b) | a的b幂次方法 |
public static double sqrt(double a) | 返回a的平方根 |
public static double random(): | 返回[0,1)的随机值 |
public static double max(double x, double y) | 返回x,y中的最大值 |
public static double min(double x, double y) | 返回x,y中的最小值 |
二、Random 类
java.util.Random
类,他可以在指定的取值范围内随机产生数字。在Random类中有两种构造方法Random() 无参构造方法,用于创建一个伪随机数生成器。
Random(long seed) 有参构造方法,使用一个long类型的 seed 种子创建伪随机数生成器。
无参构造
创建 Random 对象时没有传入种子参数,程序会自动以当前时间为时间戳。时间不同,所以经过算法处理每一次的运行结果都是不同的
// 无参构造
Random random = new Random();
// 0 - 100 的随机数
for (int i = 0; i < 8; i++) {
// 因为无参构造使用时间戳做种子,所以种子不同,结果不同
System.out.print(random.nextInt(100) + ", ");
}
第一次运行
61, 30, 70, 54, 11, 30, 38, 93,
第二次运行
77, 97, 32, 44, 95, 23, 28, 87,
有参构造
// 有参构造
Random random2 = new Random(3);
// 0 - 100 的随机数
// 因为有参构造使用的种子都是 3,种子相同,结果相同
for (int i = 0; i < 8; i++) {
System.out.print(random2.nextInt(100) + ", ");
}
第一次运行
34, 60, 10, 81, 28, 2, 49, 64,
第二次运行
34, 60, 10, 81, 28, 2, 49, 64,
常用方法
方法名称 | 方法描述 |
---|---|
public Random() | 创建一个新的随机数生成器。此构造方法将随机数生成器的种子设置为某个值,该值与此构造方法的所有其他调用所用的值完全不同。(没有真正的随机数,需要种子产生随机数,同一个种子产生的伪随机数序列相同) |
public Random(long seed) | 使用单个 long 种子创建一个新的随机数生成器。该种子是伪随机数生成器的内部状态的初始值,该生成器可通过方法 next(int) 维护。 |
boolean nextBoolean() | :返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 boolean 值。 |
void nextBytes(byte[] bytes) | 生成随机字节并将其置于用户提供的 byte 数组中。 |
double nextDouble() | :返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布的 double 值。 |
float nextFloat() | 返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布的 float 值。 |
double nextGaussian(): | 返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的 double 值,其平均值是 0.0,标准差是 1.0。 |
int nextInt(): | 返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。 |
int nextInt(int n) | 返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。 |
long nextLong() | 返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。 |
三、BigInteger 类
java 中表示整数类型最大是
lang
类型。可以表示 (2 的 63次方-1), 但是如果我们使用的整数比lang
还大,怎么办。
这时就可以使用BigInteger
类。理论上可以保存无限大的整数。
常用方法
方法名称 | 方法描述 |
---|---|
BigInteger(String val) | 构造方法 |
BigInteger add(BigInteger val) | 加 |
BigInteger subtract(BigInteger val) | 减 |
BigInteger multiply(BigInteger val) | 乘 |
BigInteger divide(BigInteger val) | 除 |
BigInteger remainder(BigInteger val) | 余 |
int intValue() | 将此 BigInteger 转换为 int。 |
long longValue() | 将此 BigInteger 转换为 long。 |
float floatValue() | 将此 BigInteger 转换为 float。 |
四、BigDecimal
Java 中使用
float
和double
保存浮点数,但是因为计算机是二进制的,浮点数会失去一定的精度。实际存储的是一个近似值。
但是在金融商业 计算中,很小的误差都是致命的, 所以就出现了BigDecimal
,他可以用来做精确运算。理论上可以保存无限大的浮点数。
方法名称 | 方法描述 |
---|---|
BigDecimal(String val) | 创建一个具有参数所指定以字符串表示的数值的对象 |
BigDecimal add(BigDecimal val) | 加 |
BigDecimal subtract(BigDecimal val) | 减 |
BigDecimal multiply(BigDecimal val) | 乘 |
BigDecimal divide(BigDecimal val) | 除 |
BigDecimal divide(BigDecimal divisor, int roundingMode) | 除 |
BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) | 除 |
BigDecimal remainder(BigDecimal val) | |
double doubleValue():将此 BigDecimal 转换为 double。 |
1. 格式化小数点 setScale()
BigDecimal.setScale()方法用于格式化小数点
- setScale(1)
表示保留一位小数,默认用四舍五入方式 - setScale(1,BigDecimal.ROUND_DOWN)
直接删除多余的小数位,如2.35会变成2.3 - setScale(1,BigDecimal.ROUND_UP)进位处理,
2.35变成2.4 - setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入
2.35变成2.4 - setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,
2.35变成2.3,如果是5则向下舍
2. 除法 divide()
使用除法函数在divide的时候要设置各种参数,要精确的小数位数和舍入模式,不然会出现报错
BigDecimal divide(BigDecimal divisor(除数), int scale(精确小数位), RoundingMode roundingMode(舍入模式))
-
ROUND_UP
非零部分丢弃前面数字加一
舍入远离零的舍入模式。
在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
注意,此舍入模式始终不会减少计算值的大小。 -
ROUND_DOWN
截断
接近零的舍入模式。
在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
注意,此舍入模式始终不会增加计算值的大小。 -
ROUND_CEILING
接近正无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
如果为负,则舍入行为与 ROUND_DOWN 相同。
注意,此舍入模式始终不会减少计算值。 -
ROUND_FLOOR
接近负无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;
如果为负,则舍入行为与 ROUND_UP 相同。
注意,此舍入模式始终不会增加计算值。 -
ROUND_HALF_UP
四舍五入
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。 -
ROUND_HALF_DOWN
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。
-
ROUND_HALF_EVEN
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
如果前一位为奇数,则入位,否则舍去。
以下例子为保留小数点1位,那么这种舍入方式下的结果。
1.15>1.2 1.25>1.2
-
ROUND_UNNECESSARY
断言请求的操作具有精确的结果,因此不需要舍入。