一、float转json数据精度丢失
今天在检查数据周表时发现几个数据异常,是一长串的浮点型小数,例如13.199999999901523这样,起初以为是在得到数据之前做的数据处理导致的,然而debug了一下,发现不是数据处理的问题。处理之后是13.2,之后并没有任何其他处理,直接使用put方法put进json对象里之后,json对象里的数据就变异常了。
暂时没弄清楚是为什么会出现这样的问题,可能是json解析问题,也可能是其他原因,这个原因以后再找吧。看了下同事是怎么解决的,搜了一下,发现可以用BigDecimal
来解决这个问题,我把之前的float型都改为BigDecimal型数据,这样精度可以完全准确。
今天用了BigDecimal三个方法,一是setScale(int newScale, RoundingMode roundingMode)
,可以设置保留小数位数和进位方式,比如:
setScale(1) 表示保留一位小数,默认用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN) 直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_UP) 进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP) 四舍五入,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_DOWN) 四舍五入,2.35变成2.3,如果是5则向下舍
最常用的就是 setScale(1,BigDecimal.ROUND_HALF_UP)
,四舍五入计算。
第二个是 add(BigDecimal)
方法求加法;
第三个是 divide(BigDecimal)
方法做除法;
得到教训:以后处理数据尽量不要用float这种不精确的,用BigDecimal
处理精确计算。
二、mysql周日日期处理
之前使用DATE_FORMAT( SUBDATE(CURDATE(),DATE_FORMAT(CURDATE(),'%w')-1), '%Y-%m-%d 00:00:00')
,将这一周的时间都整理成这周开始第一天的00:00:00,但是今天在检查数据的时候发现不对,本周日的数据被划分到下一周,上周日的数据被分到这一周,又是仔细的搜索了一下同事大哥的代码hhhhh,发现令人意外的操作,那就是DATE_FORMAT(date,'%u')
,上网搜了一下,%u 格式设置星期一是一周的第一天。
在网上还搜到有一种方式,不过没有试验过,是这样的:DATE_FORMAT( DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY), '%Y-%m-%d 00:00:00')
,下次试试。
附上MySQL日期处理总结:https://blog.csdn.net/zhendebuhuiqiming/article/details/104040092