计算价格, java中浮点数精度丢失的解决方案
项目交付测试, 发现多个商品,在计算价格的时候会忽高忽低??? 奇怪,看了逻辑没有毛病, debug吧, 发现在使用double计算时,精度丢失了
解决方法:涉及到小数的情况 使用BigDecimal 来保证精度
相关原理,参考这篇文章 : https://blog.csdn.net/S031302306/article/details/81563891
java.math.BigDecimal用法:
(1)把计算结果转为BigDecimal类型的
|
1
|
Double dd= new BigDecimal(cc).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); |
setScale(2, BigDecimal.ROUND_HALF_UP) 保留2位小数,
BigDecimal.ROUND_HALF_UP(4) 表示四舍五入
BigDecimal.ROUND_HALF_DOWN(5) 表示五舍六入
(2)BigDecimal 自带的方法来加减
|
1
2
3
4
5
6
7
8
9
10
|
public BigDecimal add(BigDecimal value);//加法public BigDecimal subtract(BigDecimal value);//减法public BigDecimal multiply(BigDecimal value);//乘法public BigDecimal divide(BigDecimal value);//除法BigDecimal aaa = new BigDecimal(Double.toString(aa));BigDecimal bbb = new BigDecimal(Double.toString(bb));BigDecimal ccc = bbb.subtract(aaa);Double cc = ccc.doubleValue(); |
2、创建BigDecimal对象
BigDecimal aaa = new BigDecimal(11.01);精度会缺失,数值不准确
BigDecimal bbb = new BigDecimal("11.02");准确
BigDecimal ccc = BigDecimal.valueOf(11.03);准确
最好使用字符串来创建,不要直接用double值创建
3、BigDecimal.ZERO 提供了默认值可以直接用
如上代码
|
1
|
BigDecimal zero = BigDecimal.ZERO;<br><br> |
4、BigDecimal 提供的加减乘除
public BigDecimal add(BigDecimal value);//加法
public BigDecimal subtract(BigDecimal value);//减法
public BigDecimal multiply(BigDecimal value);//乘法
public BigDecimal divide(BigDecimal value);//除法
BigDecimal的运算都没有对原值进行操作,而是返回一个新的BigDecimal对象
因此加减乘除、都需要自己再接收这个值
|
1
2
|
bbb.add(ccc);bbb=:11.02bbb=bbb.add(ccc);bbb=:22.05 |
public BigDecimal add(BigDecimal value);
|
1
2
3
4
5
|
public static double add(double value1,double value2){ BigDecimal b1 = new BigDecimal(Double.toString(value1)); BigDecimal b2 = new BigDecimal(Double.toString(value2)); return b1.add(b2).doubleValue();} |
5、compareTo
BigDecimal的比较用的是BigDecimal的compareTo方法,将此 BigDecimal 与指定的 BigDecimal 比较。
根据此方法,值相等但具有不同标度的两个BigDecimal对象(如,2.0 和 2.00)被认为是相等的。
当此 BigDecimal 在数字上小于、等于或大于被比较对象时,返回 -1、0 或 1。
|
1
2
3
4
5
6
|
BigDecimal one = BigDecimal.valueOf(1);BigDecimal two = BigDecimal.valueOf(2);BigDecimal three = one.add(two);int i1 = one.compareTo(two);//-1int i2 = two.compareTo(two);//0int i3 = three.compareTo(two);//1 |

浙公网安备 33010602011771号