A:BigDecimal
float类型和double的数据存储和整数不一样。它们大部分的时候,都是带有有效数字位。
于是在运算的时候,float类型和double很容易丢失精度。所以,为了能精确的表示、计算浮点数,Java提供了BigDecimal
BigDecimal类:不可变的、任意精度的有符号十进制数,可以解决数据丢失问题。
* 构造方法:
* public BigDecimal(String val)
*
* public BigDecimal add(BigDecimal augend) +
* public BigDecimal subtract(BigDecimal subtrahend) -
* public BigDecimal multiply(BigDecimal multiplicand) *
* public BigDecimal divide(BigDecimal divisor) /
* public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode):商,几位小数,如何舍取
B:BigInteger
* 构造方法:
* BigInteger(String val) * public BigInteger add(BigInteger val):加
* public BigInteger subtract(BigInteger val):减
* public BigInteger multiply(BigInteger val):乘
* public BigInteger divide(BigInteger val):除
* public BigInteger[] divideAndRemainder(BigInteger val):返回商和余数的数组
C:Math用于数学运算的类
* 成员变量:
* public static final double PI
* public static final double E
* 成员方法:
* public static int abs(int a):绝对值
* public static double ceil(double a):向上取整
* public static double floor(double a):向下取整
* public static int max(int a,int b):最大值 (min自学)
* public static double pow(double a,double b):a的b次幂
* public static double random():随机数 [0.0,1.0)
* public static int round(float a) 四舍五入(参数为double的自学)
* public static double sqrt(double a):正平方根
// public static double ceil(double a):向上取整
System.out.println("ceil:" + Math.ceil(12.34));//13
System.out.println("ceil:" + Math.ceil(12.56));//13
System.out.println("--------------");
// public static double floor(double a):向下取整
System.out.println("floor:" + Math.floor(12.34));//12
System.out.println("floor:" + Math.floor(12.56));//12
System.out.println("--------------");
请设计一个方法,可以实现获取任意范围内的随机数
public static int getRandom(int start, int end) {
// 回想我们讲过的1-100之间的随机数
// int number = (int) (Math.random() * 100) + 1;
// int number = (int) (Math.random() * end) + start;
// 发现有问题了,怎么办呢?
int number = (int) (Math.random() * (end - start + 1)) + start;
return number;
D:Random:产生随机数的类
* 构造方法:
* public Random():没有给种子,用的是默认种子,是当前时间的毫秒值
* public Random(long seed):给出指定的种子
*
* 给定种子后,每次得到的随机数是相同的。
*
* 成员方法:
* public int nextInt():返回的是int范围内的随机数
* public int nextInt(int n):返回的是[0,n)范围的内随机数
E:System类包含一些有用的类字段和方法,它不能被实例化。
* 方法:
* public static void gc():运行垃圾回收器。
* public static void exit(int status):终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。
* public static long currentTimeMillis():返回以毫秒为单位的当前时间
* public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
* 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置,总共复制length个元素。
数组复制的案例
public class SystemDemo {
public static void main(String[] args) {
// 定义数组
int[] arr = { 11, 22, 33, 44, 55 };
int[] arr2 = { 6, 7, 8, 9, 10 };
// 用arr的22,33替换arr2的8,9
// 从arr数组的第2个元素开始复制到arr2数组的第3个元素,总共复制2个元素。
System.arraycopy(arr, 1, arr2, 2, 2);
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(arr2));
}
}
F:Date 表示特定的瞬间,精确到毫秒。
* 构造方法:
* Date():根据当前的默认毫秒值创建日期对象
* Date(long date):根据给定的毫秒值创建日期对象
/* 从Date得到一个毫秒值
* getTime()
* 把一个毫秒值转换为Date
* 构造方法
* setTime(long time)
*/
G:DateForamt 对日期和字符串进行格式化和解析的抽象类
但是由于是抽象类,所以使用具体子类SimpleDateFormat。
* Date -- String(格式化)
* public final String format(Date date)
*
* String -- Date(解析)
* public Date parse(String source)
* SimpleDateFormat的构造方法:
* SimpleDateFormat():默认模式
* SimpleDateFormat(String pattern):给定的模式
* 这个模式字符串该如何写呢?
* 通过查看API,我们就找到了对应的模式
* 年 y
* 月 M
* 日 d
* 时 H
* 分 m
* 秒 s
* 2014年12月12日 12:12:12对应
* yyyy年MM月dd日 HH:mm:ss
案例:
把当前的时间以"yyyy年MM月dd日 HH:mm:ss"格式打印出来,且把"2008-08-08 12:12:12"解析为时间
public class DateFormatDemo {
public static void main(String[] args) throws ParseException {
// Date -- String
// 创建日期对象
Date d = new Date();
// 创建格式化对象,给定模式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
// public final String format(Date date)
String s = sdf.format(d);
System.out.println(s);
//String -- Date
String str = "2008-08-08 12:12:12";
//在把一个字符串解析为日期的时候,请注意格式必须和给定的字符串格式匹配
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dd = sdf2.parse(str);
System.out.println(dd);
}
}
H:Calendar 对日历进行操作的类
/* 最常用来为其创建对象的方式是通过该类的静态方法getInstance()
* public static Calendar getInstance() 返回的 Calendar 基于当前系统的日历时间(北京时间)。
*
* 获取日历字段的方法:
* public int get(int field):返回给定日历字段的值。
* 日历类中的每个日历字段都是静态的成员变量,并且是int类型。使用类名直接获取
* 如:Calendar.YEAR;Calendar.MONTH;Calendar.DATE; */
// 其日历字段已由当前日期和时间初始化:
Calendar rightNow = Calendar.getInstance(); // 子类对象
// 获取年
int year = rightNow.get(Calendar.YEAR);
// 获取月
int month = rightNow.get(Calendar.MONTH);
// 获取日
int date = rightNow.get(Calendar.DATE);
System.out.println(year + "年" + (month + 1) + "月" + date + "日");
设置和更改日历字段的方法
/*
* public void add(int field,int amount):根据给定的日历字段和对应的时间,来对当前的日历进行操作。
* public final void set(int year,int month,int date):设置当前日历的年月日
*/
案例1:获取5年后的10天前日期,然后把当前日期设置为2011年11月11日
public class CalendarDemo {
public static void main(String[] args) {
// 获取当前的日历时间
Calendar c = Calendar.getInstance();
// 5年后的10天前
c.add(Calendar.YEAR, 5);
c.add(Calendar.DATE, -10);
// 获取年
int year = c.get(Calendar.YEAR);
// 获取月
int month = c.get(Calendar.MONTH);
// 获取日
int date = c.get(Calendar.DATE);
System.out.println(year + "年" + (month + 1) + "月" + date + "日");
System.out.println("--------------");
c.set(2011, 11, 11);
// 获取年
year = c.get(Calendar.YEAR);
// 获取月
month = c.get(Calendar.MONTH);
// 获取日
date = c.get(Calendar.DATE);
System.out.println(year + "年" + (month + 1) + "月" + date + "日");
}
}
案例2:编写程序,该程序启动后用户可以按“yyyy-MM-dd”的格式输入一个日期,程序计算这一天是星期几,并且计算出是一年中的第几天。
public class Test9 {
public static void main(String[] args) throws ParseException {
//给定模式创建SimpleDateFormat对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个日期,格式为‘yyyy-MM-dd’:");
String str = sc.nextLine();
//解析日期
Date d = sdf.parse(str);
//创建日历对象
Calendar cal = Calendar.getInstance();
//设置当前的日历时间为解析的时间
cal.setTime(d);
//获取星期
int week = cal.get(Calendar.DAY_OF_WEEK);
System.out.println("这一天是星期"+(week-1));
//获取天数
int day = cal.get(Calendar.DAY_OF_YEAR);
System.out.println("这一天是一年中的第"+day+"天");
}
}
案例3:获取任意一年的二月有多少天
/*
* 获取任意一年的二月有多少天
*
* 分析:
* A:键盘录入任意的年份
* B:设置日历对象的年月日
* 年就是A输入的数据
* 月是2
* 日是1
* C:把时间往前推一天,就是2月的最后一天
* D:获取这一天输出即可
*/
public class CalendarTest {
public static void main(String[] args) {
// 键盘录入任意的年份
Scanner sc = new Scanner(System.in);
System.out.println("请输入年份:");
int year = sc.nextInt();
// 设置日历对象的年月日
Calendar c = Calendar.getInstance();
c.set(year, 2, 1); // 其实是这一年的3月1日
// 把时间往前推一天,就是2月的最后一天
c.add(Calendar.DATE, -1);
// 获取这一天输出即可
System.out.println(c.get(Calendar.DATE));
}
}