java代码避坑指南笔记
1 浮点数和整型介绍
浮点数:
浮点数是属于有理数中某特点子集的数字表示,在计算机中用以近似表示任意某个实数
整型:
计算机中一个基本的专业术语,指没有小数部分的数据
2 货币类型数据的选择
均以最小货币单位且整型类型来进行存储
3 浮点数据类型的问题
精度丢失
3.1 单精度的数据存储格式
符号(1位),指数8位,有效数字23位,一般后台要用Bigdecimal接收,以免数据精度丢失
3.2 浮点数避坑
浮点数之间的等值判断,基本数据类型不能用===比较,包装类型不能用equals来比较
可以指定一个误差范围,两个浮点数的差值在此范围内,则认为是相等的,正确的比较方式如下:
float a=1.0F-0.9F
float b=0.9F-0.8F
float diff=1e-6F
if(Math.abs(a-b)<diff){
System.out.println("true")
}
BigDecimal的等值比较应使用CompareTo()方法,而不是equals()方法
equals()方法会比较值和精度(1.0和1.00比较返回结果为false)
CompareTo()比较会忽略精度
禁止使用构造方法BigDecimal(double)将double值转化为BigDecimal对象
4 日期数据类型
4.1 Java中传统日期API
Date :表示特定的瞬间,精确到毫秒
SimdateFormat:用来进行时间格式转换
Calendar:为特定瞬间和一组日历字段之间的转换以及操作日历字段提供了方法
Java8新增的日期API:
LocalDate:代表日期
LocalTime:代表时刻
LocalDateTime:代表具体时间
Instant:代表时间戳
注意:所有的日期类都是线程不安全的,java8新增的日期API是线程安全的
System.CurrentTimeMills()是获取时间毫秒数而不是new Date().getTime(),如果要想获得更加精确的纳秒级值时,使用System.nanoTime
5 在高并发场景中,避免使用“等于”判断作为中断或者退出的条件,如果并发没有处理好,容易产生等值判断被击穿的情况,使用大于或小于的区间来判断