2018-07-13关于BigDecimal.ROUND_DOWN丢失精度的坑
最近在做项目时,有一个保留两位小数的需求,该需求要求不四舍五入,即将两位小数后的数直接舍弃,网上查了BigDecimal的用法,发现ROUND_ROUND_DOWN这种舍弃方式符合需求,故使用该方式.
【2018-07-13关于BigDecimal.ROUND_DOWN丢失精度的坑】double money = 0.030;
money= new BigDecimal(money).setScale(2,BigDecimal.ROUND_DOWN).doubleValue();
用以上方式进行保留两位小数的操作,发现money变成了0.29(预期结果是0.03)
网上找了许多资料,找到如下解决方法:
1 BigDecimal(double val)
Translates a double into a BigDecimal.
-----------------------------------------------------
2 BigDecimal(String val)
Translates the String repre sentation of a BigDecimal into a BigDecimal.
这是BigDecimal的两个构造方法,我使用的是第一个构造方法,导致丢失精度。
使用第二个构造函数即可让ROUND_DOWN正常工作
money = new BigDecimal(""+money).setScale(2,BigDecimal.ROUND_DOWN).doubleValue();
來源:https://www.jianshu.com/p/c7924842ed7c
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- 四首关于旅行记忆的外文歌曲
- 醒不来的梦
- 关于自我为中心的一点感想
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- 关于Ruby的杂想
- 关于读书的思考
- 关于this的一些问题(1)
- 《声之形》
- 关于如何沟通的1/2/3