Java中BigInteger类、BigDecimal类、Date类、DateFormat类、Calendar类

BigInteger类

  • BigInteger类概述
    • 可以让超过Integer范围内的数据进行运算
  • 构造方法
    • public BigInteger(String val)

这个类就很好理解了,首先我们要了解Integer的范围是多少?

public class BigIntegerDemo { 
     public static void main(String[] args) {
        //我们先来输出Integer的最大最小值              
       System.out.println(Integer.MAX_VALUE);//2147483647 
       System.out.println(Integer.MIN_VALUE);//-2147483648 
       //可以看到Integer的范围,如果我们超过Integer的范围,就要用BigInteger了 
      //假如我们用Integer来创建一个超出它的范围的一个对象,那么肯定是报错的 
      // Integer iii = new Integer("2147483648");
      // NumberFormatException
      //    System.out.println(iii); 
      // 所以通过大整数来创建对象 
      BigInteger bi = new BigInteger("2147483648");    
      System.out.println("BigInteger :" + bi);//BigInteger :2147483648 
   }
}
  • BigInteger类成员方法
    • 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):返回商和余数的数组
public class BigIntegerDemo { 
     public static void main(String[] args) { 
       //首先创建两个对象,然后我们来验证加减乘除的成员方法 
       BigInteger bi1 = new BigInteger("100");
       BigInteger bi2 = new BigInteger("50"); 
      //加 
      System.out.println("add:" + bi1.add(bi2));//add:150 
     //减 
    System.out.println("subtract:" + bi1.subtract(bi2));//subtract:50 
    //乘 
     System.out.println("multiply:" + bi1.multiply(bi2));//multiply:5000 
     //除
     System.out.println("divide:" + bi1.divide(bi2));
      //divide:2 
      BigInteger[] bis = bi1.divideAndRemainder(bi2); 
      System.out.println("商:" + bis[0]);   //商:2
      System.out.println("余数:" + bis[1]);  //余数:0 
   }
}

BigDecimal类

看到了这个类,肯定有人都不知道它是用来干什么的,我来给大家解释一下
由于在运算的时候,float类型和double很容易丢失精度。所以,为了能精确的表示、计算浮点数,Java提供了BigDecimal类

  • BigDecimal类概述
    • 不可变的、任意精度的有符号十进制数。
  • 构造方法
    • public BigDecimal(String val)
public class BigDecimalDemo {
    //下面这些输出结果你能看出他们的结果吗?在看看下面的输出结果是不是和你想的一样呢? 
   public static void main(String[] args) { 
         System.out.println(0.09 + 0.01); 
         System.out.println(1.0 - 0.32); 
         System.out.println(1.015 * 100); 
        System.out.println(1.301 / 100); 
        System.out.println(1.0 - 0.12); 
  }
}
  • BigDecimal类成员方法
    • 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)�:商,保留几位小数
public class BigDecimalDemo { 
        public static void main(String[] args) { 
BigDecimal bd1 = new BigDecimal("0.09"); 
BigDecimal bd2 = new BigDecimal("0.01"); 
System.out.println("add:" + bd1.add(bd2)); 
BigDecimal bd3 = new BigDecimal("1.0"); 
BigDecimal bd4 = new BigDecimal("0.32"); 
System.out.println("subtract:" + bd3.subtract(bd4)); 
BigDecimal bd5 = new BigDecimal("1.015"); 
BigDecimal bd6 = new BigDecimal("100"); 
System.out.println("multiply:" + bd5.multiply(bd6)); 
BigDecimal bd7 = new BigDecimal("1.301");
BigDecimal bd8 = new BigDecimal("100"); 
System.out.println("divide:" + bd7.divide(bd8)); System.out.println("divide:"+ bd7.divide(bd8, 3, BigDecimal.ROUND_HALF_UP)); 
System.out.println("divide:"+ bd7.divide(bd8, 8, BigDecimal.ROUND_HALF_UP)); 
     }
}

如果你仔细看结果你会发现,除法最后保留几位小数,还有为什么要用BigDecimal.ROUND_HALF_UP,我来再给大家讲讲除法的详细说明

下面我们来看看除法的详细说明:
- divide(BigDecimal divisor, int scale, introundingMode)

  • BigDecimal的setScale方法 :BigDecimal.setScale() 方法用于格式化小数点 ,表示保留一位小数,默认用四舍五入方式
    • 直接删除多余的小数位,如2.35会变成2.3
  • setScale(1,BigDecimal.ROUND_DOWN)
    - 进位处理,2.35变成2.4 setScale(1,BigDecimal.ROUND_UP)
    - 四舍五入,2.35变成2.4 setScale(1,BigDecimal.ROUND_HALF_UP)
    - 四舍五入,2.35变成2.3,如果是5则向下舍setScaler(1,BigDecimal.ROUND_HALF_DOWN)
  • BigDecimal枚举常量用法摘要 :
    - CEILING 向正无限大方向舍入的舍入模式。
    - DOWN 向零方向舍入的舍入模式。
    - FLOOR 向负无限大方向舍入的舍入模式。
    - HALF_DOWN 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。
    - HALF_EVEN 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
    - HALF_UP 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。
    - UNNECESSARY 用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。
    - UP 远离零方向舍入的舍入模式。

Date类

  • Date类概述
    • 类 Date 表示特定的瞬间,精确到毫秒。
  • 构造方法
    • public Date():根据当前的默认毫秒值创建日期对象
    • public Date(long date):根据给定的毫秒值创建日期对象
public class DateDemo { 
      public static void main(String[] args) { 
// 创建对象 
Date d = new Date();
System.out.println("d:" + d) 
//long time = System.currentTimeMillis();
//获取当前的时间 
// 创建对象
 long time = 1000 * 60 * 60; 
// 1小时 
Date d2 = new Date(time); 
System.out.println("d2:" + d2); 
     }
}
  • 成员方法
    • public long getTime():获取时间,以毫秒为单位(从Date得到一个毫秒值)
    • public void setTime(long time):设置时间(把一个毫秒值转换为Date)
public class DateDemo { 
    public static void main(String[] args) { 
    // 创建对象 
Date d = new Date(); 
   // 获取时间 
long time = d.getTime(); 
System.out.println(time); 
System.out.println(System.currentTimeMillis());
//运行结果可以发现,上面的结果是相同的 
// 设置时间 
d.setTime(1000); 
System.out.println("d:" + d); 
}
}

我们发现得到的日期不是我们平时看到的,是国外的英文和数字组合,这样让我们读起来就很不爽了,那么,我们有办法让它变成中国式的年月日时分秒类型的吗?答案是肯定可以的。java为我们提供了DateFormat类,下面我们来进行学习

DateFormat类

  • DateFormat类概述
    • DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。
    • 是抽象类,所以使用其子类SimpleDateFormat
  • SimpleDateFormat构造方法
    • public SimpleDateFormat():默认模式
    • public SimpleDateFormat(String pattern):给定的模式
    给定模式字符串该如何写呢?我们可以去看API找到对应的模式

        年 y
        月 M
        日 d
        时 H
        分 m
        秒 s
        所以一般我们要这样书写”yyyy年MM月dd日 HH:mm:ss”
        就会得到相应的日期:比如 2016年08月17日 23:05:16
  • 成员方法
    • public final String format(Date date):Date – String(格式化)
    • public Date parse(String source):String – Date(解析)
public class DateFormatDemo { 
     public static void main(String[] args) throws ParseException { 
  // Date -- String 
// 创建日期对象 
Date d = new Date(); 
// 创建格式化对象
// SimpleDateFormat sdf = new SimpleDateFormat(); 
// 给定模式
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); 

// Date -- String(格式化) 
String s = sdf.format(d); 
System.out.println(s); 

//String -- Date(解析) 
String str = "2016-08-08 12:12:12"; 
//在把一个字符串解析为日期的时候,请注意格式必须和给定的字符串格式匹配 
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
Date dd = sdf2.parse(str); 
System.out.println(dd); 
}
}

计算你来到世界的天数

public class MyYearOldDemo {
    public static void main(String[] args) throws ParseException { 
// 键盘录入你的出生的年月日,注意和下面的格式相同yyyy-MM-dd Scanner sc = new Scanner(System.in); 
System.out.println("请输入你的出生年月日:"); 
String line = sc.nextLine(); 
// 把该字符串转换为一个日期 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
Date d = sdf.parse(line); 
// 通过该日期得到一个毫秒值
 long myTime = d.getTime(); 
// 获取当前时间的毫秒值 
long nowTime = System.currentTimeMillis(); 
// 用nowTime - myTime 得到一个毫秒值
 long time = nowTime - myTime; 
// 把time 的毫秒值转换为年 
long day = time / 1000 / 60 / 60 / 24; System.out.println("你来到这个世界:" + day + "天"); 
}
}

Calendar类

  • Calendar类概述
    • Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
  • 成员方法
    • public static Calendar getInstance()
    • public int get(int field):返回给定日历字段的值。日历类中的每个日历字段都是静态的成员变量,并且是int类型。
    • public void add(int field,int amount):根据给定的日历字段和对应的时间,来对当前的日历进行操作。
    • public final void set(int year,int month,int date):设置当前日历的年月日
public class CalendarDemo { 
   public static void main(String[] args) { 
// 其日历字段已由当前日期和时间初始化: 
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 + "日"); 
// 5年后的10天前 
c.add(Calendar.YEAR, 5); 
c.add(Calendar.DATE, -10); 
// 获取年 
year = c.get(Calendar.YEAR); 
// 获取月 
month = c.get(Calendar.MONTH); 
// 获取日 date = c.get(Calendar.DATE);
 System.out.println(year + "年" + (month + 1) + "月" + date + "日"); 
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 + "日"); 
}
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,621评论 18 399
  • [TOC] 正则表达式 概述及基本使用 正则表达式:是指用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串...
    lutianfei阅读 360评论 0 2
  • import java.text.SimpleDateFormat;import java.util.Calend...
    霙愔阅读 749评论 0 2
  • 主要积累一些开发中比较 常用的工具类,部分借鉴于网络,主要来源于平时开发因需求而生的小工具类 13、ArithUt...
    大鸭梨leepear阅读 669评论 0 1
  • 未来不会来到,你所拥有的只是今天,是此刻,此刻积极,你便永远昂扬,此刻消沉,你便一颓到底。 该面对的始终要面对,若...
    不隔阅读 258评论 1 1