一、背景
数据使用时为了防止精度丢失,所以选择了BigDecimal。
二、坑点记录
- 初始化,BigDecimal初始化可以使用如下两种方式避免精度大坑:
BigDecimal aa = BigDecimal.valuOf(1.1);
BigDecimal bb = new BigDecimal("2.2");
- 比较, BigDecimal的比较一定推荐CompareTo,不要使用equals,因为但凡精度不同都会影响判断,比如用equals时0不等于0.0;
- 最重要的精度大坑,防不胜防的bug,发现躺坑的背景是,有一笔数据的记录为防止精度问题,存数据是乘10000,理论一个保留两位小数的数字乘以10000应该是一个整数,但是,BigDecimal的特性来喽,它乘之后保留小数位,如:1.21*10000=12100.00,这时,如果你忘记去掉.00,那么转为字符串后,本来是12100这个字符串就成了12100.00,这时,你的下游如果校验字符串长度,你就完了。 解决方案是什么呢,没错,干掉它。
//运算后四舍五入取整
BigDeciaml cc = new BigDecimal("1.21").multiply(new BigDeciaml(10000)).setScale(0, RoundingMode.HALF_UP)
三、小记重点
1、BigDecimal从Number继承的,是不可变的(immutable),在运算后悔产生一个新的对象,所以要记得保存操作后的值。
版权声明:本文为Ashes18原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。