• Java-Day16 日期和时间相关API、数字格式化相关API


    目录

    1. JDK8之前日期时间API

    1.1 java.lang.System类

    1.2 java.util.Date类

    1.3 java.text.SimpleDateFormat类

    1.4 java.util.Calendar(日历)类

    2. JDK8中新日期时间API

    2.1 LocalDate、LocalTime、LocalDateTime

    2.2 瞬时:Instant

    2.3 格式化与解析日期或时间DateTimeFormatter类

    2.4 其他API

    3. DecimalFormat和NumberFormat等

    3.1 NumberFormat

     3.2 DecimalFormat

    4. BigInteger与BigDecimal

    4.1 BigInteger

    4.2 BigDecimal


    1. JDK8之前日期时间API

    JDK8之前日期时间API的继承树

    1.1 java.lang.System类

    System类提供的public static long currentTimeMillis()用来返回当前时 间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。

    此方法适于计算时间差。

    计算世界时间的主要标准有:

    • UTC(Coordinated Universal Time)

    • GMT(Greenwich Mean Time)

    • CST(Central Standard Time)

    1.2 java.util.Date类

    表示特定的瞬间,精确到毫秒

    构造器

    • Date():使用无参构造器创建的对象可以获取本地当前时间。

    • Date(long date)

    常用方法

    • getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

    • toString():把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz是时间标准。

    其它很多方法都过时了。

    1.3 java.text.SimpleDateFormat类

    Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat 类是一个不与语言环境有关的方式来格式化和解析日期的具体类。

    它允许进行格式化:日期==>文本、解析:文本==>日期

    格式化:

    SimpleDateFormat() :默认的模式和语言环境创建对象

    public SimpleDateFormat(String pattern):该构造方法可以用参数pattern 指定的格式创建一个对象,该对象调用

    public String format(Date date):方法格式化时间对象date

    解析:

    public Date parse(String source):从给定字符串的开始解析文本,以生成 一个日期。

    1.4 java.util.Calendar(日历)类

    Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。

    获取Calendar实例的方法

    • 使用Calendar.getInstance()方法

    • 调用它的子类GregorianCalendar的构造器

    一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想 要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、 MINUTE、SECOND

    • public void set(int field,int value)

    • public void add(int field,int amount)

    • public final Date getTime()

    • public final void setTime(Date date)

    注意:获取月份时:一月是0,二月是1,以此类推,12月是11;获取星期时:周日是1,周二是2 ,... ,周六是7

    1. package com.openlab.day16;
    2. import java.text.DateFormat;
    3. import java.text.ParseException;
    4. import java.text.SimpleDateFormat;
    5. import java.util.Calendar;
    6. import java.util.Date;
    7. import org.junit.jupiter.api.Test;
    8. class TestDate {
    9. @Test
    10. void test() {
    11. // java.util.Date类,用来创建时间和日期
    12. // 如果调用默认的没有参数的构造函数,
    13. // 则创建的当前时间
    14. Date date = new Date();
    15. // 1970年
    16. // Date date = new Date(0L);
    17. // 注意,不建议使用如下的一些构造
    18. // Date date = new Date("1980/02/02");
    19. // Date date = new Date(100, 02, 03);
    20. // Date date = new Date(100, 02, 03, 12, 23);
    21. // Date date = new Date(100, 02, 03, 12, 23, 59);
    22. System.out.println(date);
    23. // System.err.println(date.getYear());
    24. // System.err.println(date.getMonth());
    25. // System.err.println(date.getDate());
    26. // System.err.println(date.getDay());
    27. // date.setHours(14);
    28. // System.out.println(date);
    29. // 时间戳(邮戳),计算机中时间就是数字
    30. System.out.println(date.getTime());
    31. // Asia/Shanghai
    32. // 获取系统当前时间戳,毫秒数
    33. System.err.println(System.currentTimeMillis());
    34. // 获取系统当前时间戳, 纳秒数
    35. System.err.println(System.nanoTime());
    36. }
    37. @Test
    38. void testFormatDate() {
    39. // 用来格式化日期的格式化对象
    40. DateFormat dateFormat = new SimpleDateFormat("Gyyyy年MM月dd日 HH:mm:ss");
    41. Date date = new Date();
    42. // 将时间对象(Java对象)转换为需要的字符串格式
    43. String strDate = dateFormat.format(date);
    44. System.out.println(strDate);
    45. }
    46. @Test
    47. void testFormatDate02() {
    48. // 页面传递过来时间,字符串来描述的
    49. /**
    50. * 在高并发场景下,SimpleDateFormat是一个非线程安全类
    51. * 在高并发场景下,不建议使用SimpleDateFormat,如果一定要是用,建议加锁操作
    52. * JDK为了解决这些问题,在jdk8.0之后,
    53. * 专门设计了一套新的API用来解决高并发场景下的时间操作问题
    54. */
    55. DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    56. String strDate = "2020-03-08 18:59:22";
    57. // 将特定时间字符串转换为时间对象
    58. Date date = null;
    59. try {
    60. date = dateFormat.parse(strDate);
    61. } catch (ParseException e) {
    62. e.printStackTrace();
    63. }
    64. System.out.println(date);
    65. }
    66. @Test
    67. void testCalendar() {
    68. // 日历类
    69. Calendar calendar = Calendar.getInstance();
    70. // 获取当前时间以及相关常数
    71. System.out.println(calendar.get(Calendar.YEAR));
    72. System.out.println(calendar.get(Calendar.MONTH));
    73. System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
    74. System.out.println(calendar.get(Calendar.HOUR));
    75. }
    76. }

    2. JDK8中新日期时间API

            如果我们可以跟别人说:“我们在1502643933071见面,别晚了!”那么就再简单不 过了。但是我们希望时间与昼夜和四季有关,于是事情就变复杂了。JDK 1.0中包含了 一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用 了。而Calendar并不比Date好多少。它们面临的问题是:

    • 可变性:像日期和时间这样的类应该是不可变的。

    • 偏移性:Date中的年份是从1900开始的,而月份都从0开始。

    • 格式化:格式化只对Date有用,Calendar则不行。

    • 此外,它们也不是线程安全的;不能处理闰秒等。

    总结:对日期和时间的操作一直是Java程序员最痛苦的地方之一

           JDK8,吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。 新的 java.time 中包含了所有关于本地日期(LocalDate)、本地时间 (LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime) 和持续时间(Duration)的类。历史悠久的 Date 类新增了 toInstant() 方法, 用于把 Date 转换成新的表示形式。这些新增的本地化时间日期 API 大大简 化了日期时间和本地化的管理。

    • java.time – 包含值对象的基础包
    • java.time.chrono – 提供对不同的日历系统的访问
    • java.time.format – 格式化和解析时间和日期
    • java.time.temporal – 包括底层框架和扩展特性
    • java.time.zone – 包含时区支持的类

    说明:大多数开发者只会用到基础包和format包,也可能会用到temporal包。因此,尽 管有68个新的公开类型,大多数开发者,大概将只会用到其中的三分之一

    2.1 LocalDate、LocalTime、LocalDateTime

    LocalDate、LocalTime、LocalDateTime 类是其中较重要的几个类,它们的实例 是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。 它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区 相关的信息。

    • LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期。

    • LocalTime表示一个时间,而不是日期。

    • LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一。

    注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示 法,也就是公历

    方法说明
    now() / * now(ZoneId zone)静态方法,根据当前时间创建对象/指定时区的对象
    of()静态方法,根据指定日期/时间创建对象
    getDayOfMonth()/getDayOfYear()获得月份天数(1-31) /获得年份天数(1-366)
    getDayOfWeek()获得星期几(返回一个 DayOfWeek 枚举值)
    getMonth()获得月份, 返回一个 Month 枚举值
    getMonthValue() / getYear()获得月份(1-12) /获得年份
    getHour()/getMinute()/getSecond()获得当前对象对应的小时、分钟、秒
    withDayOfMonth()/withDayOfYear()/ withMonth()/withYear()将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象
    plusDays(), plusWeeks(), plusMonths(), plusYears(),plusHours()向当前对象添加几天、几周、几个月、几年、几小时
    minusMonths() / minusWeeks()/ minusDays()/minusYears()/minusHours()从当前对象减去几月、几周、几天、几年、几小时

    2.2 瞬时:Instant

    Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。

    在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中, 也是从1970年开始,但以毫秒为单位。

    java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间 单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。 概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒 数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级

    (1 ns = 10-9 s) 1秒 = 1000毫秒 =10^6微秒=10^9纳秒

    方法描述
    now()静态方法,返回默认UTC时区的Instant类的对象
    ofEpochMilli(long epochMilli)静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒 数之后的Instant类的对象
    atOffset(ZoneOffset offset)结合即时的偏移来创建一个 OffsetDateTime
    toEpochMilli()返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳

    时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01 日08时00分00秒)起至现在的总秒数

    2.3 格式化与解析日期或时间DateTimeFormatter类

    java.time.format.DateTimeFormatter 类,该类提供了三种格式化方法

    预定义的标准格式。如: ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME

    本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)

    自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

    方 法描 述
    ofPattern(String pattern)静态方法 , 返 回 一 个 指 定 字 符 串 格 式 的 DateTimeFormatter
    format(TemporalAccessor t)格式化一个日期、时间,返回字符串
    parse(CharSequence text)

    将指定格式的字符序列解析为一个日期、时间

    1. package com.openlab.day16;
    2. import java.time.Instant;
    3. import java.time.LocalDate;
    4. import java.time.LocalDateTime;
    5. import java.time.LocalTime;
    6. import java.time.Month;
    7. import java.time.format.DateTimeFormatter;
    8. import org.junit.jupiter.api.Test;
    9. public class Testjdk8DateTime {
    10. @Test
    11. void testLocalDate() {
    12. // LocalDate 是获取当前本地日期对象
    13. LocalDate now = LocalDate.now();
    14. System.out.println(now);
    15. // 使用of方法获取对应时间的日期对象
    16. // LocalDate date = LocalDate.of(2020, 3, 4);
    17. LocalDate date = LocalDate.of(2020, Month.MARCH, 4);
    18. System.out.println(date);
    19. // 使用字符串时间格式创建日期对象
    20. LocalDate date2 = LocalDate.parse("2020-08-23");
    21. System.out.println(date2);
    22. }
    23. @Test
    24. void testLocalDate02() {
    25. // LocalDate 是获取当前本地日期对象
    26. LocalDate now = LocalDate.now();
    27. System.out.println(now.getYear());
    28. System.out.println(now.getMonthValue());
    29. System.out.println(now.getDayOfMonth());
    30. }
    31. @Test
    32. void testLocalTime() {
    33. LocalTime now = LocalTime.now();
    34. System.out.println(now);
    35. LocalDateTime now2 = LocalDateTime.now();
    36. System.out.println(now2);
    37. }
    38. @Test
    39. void testLocalTimeFormatter() {
    40. LocalDateTime now2 = LocalDateTime.now();
    41. System.out.println(now2);
    42. DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
    43. String strDate = now2.format(pattern);
    44. System.out.println(strDate);
    45. LocalDateTime localDateTime = LocalDateTime.parse("2016年03月04日 12:12:12", DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss"));
    46. System.out.println(localDateTime);
    47. }
    48. @Test
    49. void testInstant() {
    50. // 格林威治标准时间
    51. Instant now = Instant.now();
    52. System.out.println(now);
    53. }
    54. }

    2.4 其他API

    ZoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris

    ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12- 03T10:15:30+01:00 Europe/Paris。

    其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如: Asia/Shanghai等

    Clock:使用时区提供对当前即时、日期和时间的访问的时钟。

    持续时间:Duration,用于计算两个“时间”间隔

    日期间隔:Period,用于计算两个“日期”间隔

    TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整 到“下一个工作日”等操作。

    TemporalAdjusters : 该类通过静态方法 (firstDayOfXxx()/lastDayOfXxx()/nextXxx())提供了大量的常用 TemporalAdjuster 的实现。

    1. // ZoneId:类中包含了所有的时区信息
    2. // ZoneId的getAvailableZoneIds():获取所有的ZoneId
    3. Set zoneIds = ZoneId.getAvailableZoneIds();
    4. for (String s : zoneIds) {
    5. System.out.println(s);
    6. }
    7. // ZoneId的of():获取指定时区的时间
    8. LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Tokyo"));
    9. System.out.println(localDateTime);
    10. //ZonedDateTime:带时区的日期时间
    11. // ZonedDateTime的now():获取本时区的ZonedDateTime对象
    12. ZonedDateTime zonedDateTime = ZonedDateTime.now();
    13. System.out.println(zonedDateTime);
    14. // ZonedDateTime的now(ZoneId id):获取指定时区的ZonedDateTime对象
    15. ZonedDateTime zonedDateTime1 = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
    16. System.out.println(zonedDateTime1);
    17. //Duration:用于计算两个“时间”间隔,以秒和纳秒为基准
    18. LocalTime localTime = LocalTime.now();
    19. LocalTime localTime1 = LocalTime.of(15, 23, 32);
    20. //between():静态方法,返回Duration对象,表示两个时间的间隔
    21. Duration duration = Duration.between(localTime1, localTime);
    22. System.out.println(duration);
    23. System.out.println(duration.getSeconds());
    24. System.out.println(duration.getNano());
    25. LocalDateTime localDateTime = LocalDateTime.of(2016, 6, 12, 15, 23, 32);
    26. LocalDateTime localDateTime1 = LocalDateTime.of(2017, 6, 12, 15, 23, 32);
    27. Duration duration1 = Duration.between(localDateTime1, localDateTime);
    28. System.out.println(duration1.toDays());
    29. //Period:用于计算两个“日期”间隔,以年、月、日衡量
    30. LocalDate localDate = LocalDate.now();
    31. LocalDate localDate1 = LocalDate.of(2028, 3, 18);
    32. Period period = Period.between(localDate, localDate1);
    33. System.out.println(period);
    34. System.out.println(period.getYears());
    35. System.out.println(period.getMonths());
    36. System.out.println(period.getDays());
    37. Period period1 = period.withYears(2);
    38. System.out.println(period1);
    39. // TemporalAdjuster:时间校正器
    40. // 获取当前日期的下一个周日是哪天?
    41. TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(DayOfWeek.SUNDAY);
    42. LocalDateTime localDateTime = LocalDateTime.now().with(temporalAdjuster);
    43. System.out.println(localDateTime);
    44. // 获取下一个工作日是哪天?
    45. LocalDate localDate = LocalDate.now().with(new TemporalAdjuster() {
    46.    @Override
    47.    public Temporal adjustInto(Temporal temporal) {
    48.        LocalDate date = (LocalDate) temporal;
    49.        if (date.getDayOfWeek().equals(DayOfWeek.FRIDAY)) {
    50.            return date.plusDays(3);
    51.       } else if (date.getDayOfWeek().equals(DayOfWeek.SATURDAY)) {
    52.            return date.plusDays(2);
    53.       } else {
    54.            return date.plusDays(1);
    55.       }
    56.   }
    57. });
    58. System.out.println("下一个工作日是:" + localDate);

    3. DecimalFormat和NumberFormat等

    3.1 NumberFormat

    在工作当中,可能经常会遇到比如数据保留两位小数显示,去除后面多余0,按指定格式输出数据这种需求,有时隔得时间久了也难免会忘记,Java提供一个工具类NumberFormat。

    NumberFormat 是所有数值格式的抽象基类。此类提供格式化和解析数值的接口。NumberFormat 还提供了一些方法来确定哪些语言环境具有数值格式,以及它们的名称是什么

    NumberFormat 可用于格式化和解析任何语言环境的数值。使代码能够完全独立于小数点、千位分隔符甚至所用特定小数位数的语言环境约定,并与数值格式是否为偶小数无关

    数值格式化

    getInstance()、getNumberInstance():返回当前默认语言环境的通用数值格式。

    getInstance(Locale)、getNumberInstance(Locale):返回指定语言环境的通用数值格式。

    NumberFormat.setMinimumIntegerDigits(int):设置数的整数部分所允许的最小位数。

    NumberFormat.setMaximumIntegerDigits(int):设置数的整数部分所允许的最大位数。

    NumberFormat.setMinimumFractionDigits(int):设置最少小数点位数,不足的位数以0补位,超出的话按实际位数输出。

    NumberFormat.setMaximumFractionDigits(int):设置最多保留小数位数,不足不补0。

    NumberFormat.getCurrencyInstance(Locale):返回指定语言环境的通货数值格式

    NumberFormat.getPercentInstance():设置数的百分比形式

    1. @Test
    2. void testNumberFormat() {
    3. // 货币、百分比……
    4. NumberFormat currencyInstance = NumberFormat.getCurrencyInstance();
    5. System.out.println(currencyInstance.format(123456)); // ¥123,456.00
    6. }
    7. @Test
    8. void testNumberFormat02() {
    9. // 货币、百分比……
    10. // NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(Locale.US);
    11. // NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(Locale.UK);
    12. // NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(Locale.FRANCE);
    13. NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(Locale.GERMAN);
    14. System.out.println(currencyInstance.format(123456)); // ¤ 123.456,00
    15. }
    16. @Test
    17. void testNumberFormat03() {
    18. // 千分位分隔符
    19. NumberFormat currencyInstance = NumberFormat.getNumberInstance();
    20. System.out.println(currencyInstance.format(123456)); // 123,456
    21. }
    22. @Test
    23. void testNumberFormat04() {
    24. // 货币、百分比……
    25. NumberFormat currencyInstance = NumberFormat.getPercentInstance();
    26. System.out.println(currencyInstance.format(1.23456)); // 123%
    27. }

     3.2 DecimalFormat

    DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字

    DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度。

    0 表示如果位数不足则以 0 填充,

    # 表示只要有可能就把数字拉上这个位置。

    如果你想了解更多,请参考 DecimalFormat 类的文档

    1. @Test
    2. void testDecimalFormat() {
    3. double num = 23465.1264566;
    4. // 主要是在.之后,表示要保留的小数位
    5. DecimalFormat df = new DecimalFormat("0.0000");
    6. String format = df.format(num);
    7. System.out.println(format); // 23465.1265
    8. // 以科学计数法展示数据
    9. DecimalFormat df2 = new DecimalFormat("0E0");
    10. System.out.println(df2.format(num)); // 2E4
    11. }
    12. @Test
    13. void test06() {
    14. double pi = 3663.1415927;
    15. System.out.println(new DecimalFormat("0").format(pi)); // 3663
    16. System.out.println(new DecimalFormat("0.00").format(pi)); // 3663.14
    17. //取两位整数和三位小数,整数不足部分以0填补。
    18. System.out.println(new DecimalFormat("00.000").format(pi));// 3663.142
    19. //取所有整数部分
    20. System.out.println(new DecimalFormat("#").format(pi)); // 3663
    21. //以百分比方式计数,并取两位小数
    22. System.out.println(new DecimalFormat("#.##%").format(pi)); // 366314.16%
    23. long c = 299792458;
    24. System.out.println(new DecimalFormat("#.#####E0").format(c));// 2.99792E8
    25. System.out.println(new DecimalFormat("00.####E0").format(c));// 29.9792E7
    26. System.out.println(new DecimalFormat(",###").format(c));// 299,792,458
    27. System.out.println(new DecimalFormat("光速大小为每秒,###米。").format(c)); // 光速大小为每秒299,792,458米。
    28. }
    29. }

    4. BigInteger与BigDecimal

    4.1 BigInteger

    Integer类作为int的包装类,能存储的最大整型值为2 31-1,Long类也是有限的, 最大为2 63-1。如果要表示再大的整数,不管是基本数据类型还是他们的包装类 都无能为力,更不用说进行运算了。

    java.math包的BigInteger可以表示不可变的任意精度的整数。BigInteger 提供 所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。 另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、 位操作以及一些其他操作。

    构造器:BigInteger(String val):根据字符串构建BigInteger对象

    常用方法:

    public BigInteger abs():返回此 BigInteger 的绝对值的 BigInteger。

    BigInteger add(BigInteger val) :返回其值为 (this + val) 的 BigInteger

    BigInteger subtract(BigInteger val) :返回其值为 (this - val) 的 BigInteger

    BigInteger multiply(BigInteger val) :返回其值为 (this * val) 的 BigInteger

    BigInteger divide(BigInteger val) :返回其值为 (this / val) 的 BigInteger。整数相除只保留整数部分。

    BigInteger remainder(BigInteger val) :返回其值为 (this % val) 的 BigInteger。

    BigInteger[] divideAndRemainder(BigInteger val):返回包含 (this / val) 后跟 (this % val) 的两个 BigInteger 的数组。

    BigInteger pow(int exponent) :返回其值为 (thisexponent) 的 BigInteger。

    4.2 BigDecimal

    float、double在运算过程都是需要转换为整数的二进制数据运算

    数量非常庞大时,不建议使用float或者double,而是使用更加精确的decimal类型

    一般的Float类和Double类可以用来做科学计算或工程计算,但在商业计算中, 要求数字精度比较高,故用到java.math.BigDecimal类。

    BigDecimal类支持不可变的、任意精度的有符号十进制定点数

    构造器:

    • public BigDecimal(double val)

    • public BigDecimal(String val)

    常用方法

    • public BigDecimal add(BigDecimal augend)

    • public BigDecimal subtract(BigDecimal subtrahend)

    • public BigDecimal multiply(BigDecimal multiplicand)

    • public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

    1. @Test
    2. void testBigDecimal() {
    3. // float、double在运算过程都是需要转换为整数的二进制数据运算
    4. System.out.println(0.1 + 0.2 == 0.3); // false
    5. // 数量非常庞大时,不建议使用float或者double
    6. // 而是使用更加精确的decimal类型
    7. // BigDecimal num1 = new BigDecimal(0.1);
    8. // BigDecimal num2 = new BigDecimal(0.2);
    9. // 如果不要以整数的形式操作,可以使用字符串
    10. BigDecimal num1 = new BigDecimal("0.1");
    11. BigDecimal num2 = new BigDecimal("0.2");
    12. System.out.println(num1.add(num2)); // 0.3
    13. }

  • 相关阅读:
    测试人生 | 97年双非学历的小哥哥,2线城市涨薪100%,我酸了......
    温故知新(十三)——CAN
    基于SpringBoot的实习管理系统
    海南热带海洋学院金秋悦读《乡村振兴战略下传统村落文化旅游设计》2023新学年许少辉八一新书​
    bat程序小功能
    三种win10任务栏频繁卡死的解决方法
    【Dubbo3高级特性】「框架与服务」服务并发控制及集群负载均衡的实践指南(含扩展SPI)
    基于LSSVM和PSO进行信号预测(Matlab代码实现)
    多维表格平台盘点 Notion、FlowUs、Airtable、SeaTable、Vika
    操作系统(九)进程通信
  • 原文地址:https://blog.csdn.net/weixin_51612062/article/details/126176082