浮点数据
- 所有的货币都以最小单位且整型类型来进行存储(可以10的小数位的个数次方进行处理,变为整数)
- 由于浮点数据容易出现精度丢失的问题,所以在mysql中尽量使用decimal(M,D)进行存储(M指十进制中小数点左右两边的总个数,D指十进制中小数点右侧的数字个数,同时M>D, D默认为0);当数据库字段使用decimal类型,java同样使用decimal类型。
- 若数据无法使用decimal定义数据时,可考虑字符串或转为整数进行存储或运算。
- 浮点数之间、基本数据类型的等值判断,都不能用“==”来比较;包装数据类型不能用equals来判断。
- BigDecimal的等值比较用compareTo(忽略精度,返回-1 or 0 or 1)
- equals方法会比较精度,返回值为true or false
- 禁止使用构造方法BigDecimal(double)的方法把double转化为BigDecimal对象
日期数据
- 关于日期可多用java8增加的API:
LocalDate: 代表日期
LocalTime: 时刻
LocalDateTime:具体时间
Instant: 时间戳 - yyyy表示当天所在的年,YYYY表示当周所在的年,如果当周存在跨年情况,返回的为下一年;
M : 月份 m : 分钟
H : 24小时制的小时数 h : 12小时制的小时数 - 获取当前毫秒数:
- System.currentTimeMillis();
- 获取纳秒数,System.nanoTime
- JDK8,针对统计时间等场景,推荐使用Instant类型
传统API中日期问题:
1. 所有的日期类都是线程不安全的
2. 日期、时间、时间戳没有明确对应的类
3. 对于格式化和解析的需求(JDK提供java.text.DateFormat抽象类,但通常情况下,SimpleDateFormat类被用于此类需求)
JDK8日期API的新增优势
1. 不变性(线程安全)
2. 关注点分离(时间日期都有各自的对应类)
3. 清晰(在所有的类中,方法都被明确定义用以完成相同的行为)
4. 实用操作(所有新的日期/时间API类都实现了一系列方法用以完成通用的任务)