今日bug解决

一、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值