10.1 和数学相关的类
10.1.1 java.lang.Math
java.lang.Math
类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单。
-
public static double abs(double a)
:返回 double 值的绝对值。
double d1 = Math.abs(-5); //d1的值为5 double d2 = Math.abs(5); //d2的值为5
-
public static double ceil(double a)
:返回大于等于参数的最小的整数。
double d1 = Math.ceil(3.3); //d1的值为 4.0 double d2 = Math.ceil(-3.3); //d2的值为 -3.0 double d3 = Math.ceil(5.1); //d3的值为 6.0
-
public static double floor(double a)
:返回小于等于参数最大的整数。
double d1 = Math.floor(3.3); //d1的值为3.0 double d2 = Math.floor(-3.3); //d2的值为-4.0 double d3 = Math.floor(5.1); //d3的值为 5.0
-
public static long round(double a)
:返回最接近参数的 long。(相当于四舍五入方法)
long d1 = Math.round(5.5); //d1的值为6.0 long d2 = Math.round(5.4); //d2的值为5.0
-
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 final double PI:返回圆周率
-
public static double max(double x, double y):返回x,y中的最大值
-
public static double min(double x, double y):返回x,y中的最小值
double result = Math.pow(2,31); double sqrt = Math.sqrt(256); double rand = Math.random(); double pi = Math.PI;
10.1.2 java.math包
(1)BigInteger
BigInteger
用于表示任意大小的整数。由于 Java 中的基本数据类型(如 int
, long
)有固定的范围和大小,因此当需要处理超出这些范围的大整数时,BigInteger
就变得非常有用。
-
BigInteger(String val)
-
BigInteger add(BigInteger val)
-
BigInteger subtract(BigInteger val)
-
BigInteger multiply(BigInteger val)
-
BigInteger divide(BigInteger val)
-
BigInteger remainder(BigInteger val)
-
....
public void test01(){ // long bigNum = 123456789123456789123456789L; BigInteger b1 = new BigInteger("123456789123456789123456789"); BigInteger b2 = new BigInteger("78923456789123456789123456789"); // System.out.println("和:" + (b1+b2));//错误的,无法直接使用+进行求和 System.out.println("和:" + b1.add(b2)); System.out.println("减:" + b1.subtract(b2)); System.out.println("乘:" + b1.multiply(b2)); System.out.println("除:" + b2.divide(b1)); System.out.println("余:" + b2.remainder(b1)); }
(2)BigDecimal
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)
-
....
public void test02(){ /*double big = 12.123456789123456789123456789; System.out.println("big = " + big);*/ BigDecimal b1 = new BigDecimal("123.45678912345678912345678912345678"); BigDecimal b2 = new BigDecimal("7.8923456789123456789123456789998898888"); // System.out.println("和:" + (b1+b2));//错误的,无法直接使用+进行求和 System.out.println("和:" + b1.add(b2)); System.out.println("减:" + b1.subtract(b2)); System.out.println("乘:" + b1.multiply(b2)); System.out.println("除:" + b1.divide(b2,20,RoundingMode.UP));//divide(BigDecimal divisor, int scale, int roundingMode) System.out.println("除:" + b1.divide(b2,20,RoundingMode.DOWN));//divide(BigDecimal divisor, int scale, int roundingMode) System.out.println("余:" + b1.remainder(b2)); }
(3)RoundingMode枚举类
如果项目对精度要求比较高所以使用到Bigdecimal,又涉及到范围限制,所以就涉及到如果除不尽是Bigdecimal的舍人模式的问题
CEILING :向正无限大方向舍入的舍入模式。
DOWN :向零方向舍入的舍入模式。
FLOOR:向负无限大方向舍入的舍入模式。
HALF_DOWN :向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。
HALF_EVEN:向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
HALF_UP:向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。
UNNECESSARY:用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。 UP:远离零方向舍入的舍入模式。
10.1.3 java.util.Random
用于产生随机数
-
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 值。
public void test03(){ Random r = new Random(); System.out.println("随机整数:" + r.nextInt()); System.out.println("随机小数:" + r.nextDouble()); System.out.println("随机布尔值:" + r.nextBoolean()); }
10.2 日期时间API
10.2.1 JDK1.8之前
1、java.util.Date
new Date():当前系统时间
long getTime():返回该日期时间对象距离1970-1-1 0.0.0 0毫秒之间的毫秒值 时间戳
new Date(long 毫秒):把该毫秒值换算成日期时间对象
public void test5(){ long time = Long.MAX_VALUE; Date d = new Date(time); System.out.println(d); } public void test4(){ long time = 1559807047979L; Date d = new Date(time); System.out.println(d); } public void test3(){ Date d = new Date(); long time = d.getTime(); System.out.println(time);//1559807047979 } public void test2(){ long time = System.currentTimeMillis(); System.out.println(time);//1559806982971 //当前系统时间距离1970-1-1 0:0:0 0毫秒的时间差,毫秒为单位 } public void test1(){ Date d = new Date(); System.out.println(d); }
2、java.text.SimpleDateFormat
SimpleDateFormat用于日期时间的格式化。
public void test10() throws ParseException{ String str = "2019年06月06日 16时03分14秒 545毫秒 星期四 +0800"; SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 SSS毫秒 E Z"); Date d = sf.parse(str); System.out.println(d); } public void test9(){ Date d = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 SSS毫秒 E Z"); //把Date日期转成字符串,按照指定的格式转 String str = sf.format(d); System.out.println(str); }
3、java.util.TimeZone
通常,使用 getDefault
获取 TimeZone
,getDefault
基于程序运行所在的时区创建 TimeZone
。
也可以用 getTimeZone
及时区 ID 获取 TimeZone
。例如美国太平洋时区的时区 ID 是 "America/Los_Angeles"。
import org.junit.Test; import java.util.TimeZone; public class TestTimezone { public void test1(){ String[] all = TimeZone.getAvailableIDs(); for (int i = 0; i < all.length; i++) { System.out.println(all[i]); } } public void test2(){ TimeZone t = TimeZone.getTimeZone("America/Los_Angeles"); System.out.println(t); } }
常见时区ID:
Asia/Shanghai UTC America/New_York
4、java.util.Locale
Locale
对象表示了特定的地理、政治和文化地区。需要 Locale
来执行其任务的操作称为语言环境敏感的 操作,它使用 Locale
为用户量身定制信息。
语言参数是一个有效的 ISO 语言代码。这些代码是由 ISO-639 定义的小写两字母代码。
国家/地区参数是一个有效的 ISO 国家/地区代码。这些代码是由 ISO-3166 定义的大写两字母代码。
Locale
类提供了一些方便的常量,可用这些常量为常用的语言环境创建 Locale
对象。
import org.junit.Test; import java.util.Locale; public class TestLocale { public void test01(){ Locale[] all = Locale.getAvailableLocales(); for (int i = 0; i < all.length; i++) { System.out.println(all[i]); } } public void test02(){ Locale 410000 = Locale.410000; System.out.println("410000 = " + 410000); } }
5、java.util.Calendar
Calendar
类是一个抽象类,它为特定瞬间与一组诸如 YEAR
、MONTH
、HOUR_OF_DAY
、HOUR
等 日历字段
之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。与其他语言环境敏感类一样,Calendar
提供了一个类方法 getInstance
,以获得此类型的一个通用的对象。
修改和获取 YEAR
、MONTH
、HOUR_OF_DAY
、HOUR
等 日历字段
对应的时间值。
void add(int field,int amount) 根据给定的日历字段和对应的时间,来对当前的日历进行操作 int get(int field) 获取当前日历的年月日 void set(int field, int value) 设置当前日历的年月日
示例代码:
import org.junit.Test; import java.util.Calendar; import java.util.TimeZone; public class TestCalendar { public void test1(){ Calendar c = Calendar.getInstance(); System.out.println(c); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH)+1; int day = c.get(Calendar.DATE); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); System.out.println(year + "-" + month + "-" + day + " " + hour + ":" + minute); } public void test2(){ TimeZone t = TimeZone.getTimeZone("America/Los_Angeles"); Calendar c = Calendar.getInstance(t); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH)+1; int day = c.get(Calendar.DATE); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); System.out.println(year + "-" + month + "-" + day + " " + hour + ":" + minute); } }