别在用BigDecimal给自己挖坑了!-创新互联
前言
名称栏目:别在用BigDecimal给自己挖坑了!-创新互联
分享地址:http://scyanting.com/article/dcggip.html
工作中,我们都会用到BigDecimal来进行金额计算,但是他有许多坑,可能针对新手不注意的话,就给自己多加几个bug了。一起来看看吧。
成都创新互联公司是一家集网站建设,平坝企业网站建设,平坝品牌网站建设,网站定制,平坝网站建设报价,网络营销,网络优化,平坝网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。创建new BigDecimal()
还是BigDecimal#valueOf()
?
创建对象的时候应该使用BigDecimal.valueOf(0.01);
new BigDecimal()
会有精度问题,所以建议使用字符串去创建对象而不是浮点类型,BigDecimal.valueOf()
底层使用的就是用字符串去创建对象。确保精度不会丢失。
BigDecimal中equals方法的实现会比较两个数字的精度,而compareTo方法则只会比较数值的大小。
public static void main(String[] args) {BigDecimal bigDecimal1 = new BigDecimal("1.0");
BigDecimal bigDecimal2 = new BigDecimal("1.00");
System.out.println(bigDecimal2.equals(bigDecimal1));
System.out.println(bigDecimal2.compareTo(bigDecimal1));
}
运行结果:
BigDecimal并不代表无限精度建议做除法等操作的时候,都写上保留位数和取值方式。
public static void main(String[] args) {BigDecimal bigDecimal1 = new BigDecimal("1.0");
BigDecimal bigDecimal2 = new BigDecimal("3.0");
bigDecimal1.divide(bigDecimal2);
}
运行结果:
BigDecimal转String要小心public static void main(String[] args) {BigDecimal bigDecimal = BigDecimal.valueOf(12345678902132123113213.12345678912345678);
//必要时,使用科学计数法
System.out.println(bigDecimal.toString());
//不使用科学计数法
System.out.println(bigDecimal.toPlainString());
//工程计算中经常使用的记录数字的方法,类似科学计数法,但要求是10的幂必须是3的倍数
System.out.println(bigDecimal.toEngineeringString());
}
String toString()
; // 有必要时使用科学计数法String toPlainString()
; // 不使用科学计数法String toEngineeringString()
; // 工程计算中经常使用的记录数字的方法,与科学计数法类似,但要求10的幂必须是3的倍数
乘法满足交换律是一个常识,但是在计算机的世界里,会出现不满足乘法交换律的情况
BigDecimal a = BigDecimal.valueOf(1.0);
BigDecimal b = BigDecimal.valueOf(3.0);
BigDecimal c = BigDecimal.valueOf(3.0);
System.out.println(a.divide(b, 2, RoundingMode.HALF_UP).multiply(c)); // 0.990
System.out.println(a.multiply(c).divide(b, 2, RoundingMode.HALF_UP)); // 1.00
别小看这这0.01的差别,在汇金领域,会产生非常大的金额差异。
最后有个关于金额计算的Money类maven坐标
org.javamoney moneta 1.1
新建Money类CurrencyUnit cny = Monetary.getCurrency("CNY");
Money money = Money.of(1.0, cny);
// 或者 Money money = Money.of(1.0, "CNY");
//System.out.println(money);
金额运算CurrencyUnit cny = Monetary.getCurrency("CNY");
Money oneYuan = Money.of(1.0, cny);
Money threeYuan = oneYuan.add(Money.of(2.0, "CNY")); //CNY 3
Money tenYuan = oneYuan.multiply(10); // CNY 10
Money fiveFen = oneYuan.divide(2); //CNY 0.5
比较相等Money fiveFen = Money.of(0.5, "CNY"); //CNY 0.5
Money anotherFiveFen = Money.of(0.50, "CNY"); // CNY 0.50
System.out.println(fiveFen.equals(anotherFiveFen)); // true
可以看到,这个类对金额做了显性的抽象,增加了金额的单位,也避免了直接使用BigDecimal的一些坑。
总结使用BigDecimal过程中,记住这些坑,使用正确的方法,让你少走弯路,少加几天班。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
名称栏目:别在用BigDecimal给自己挖坑了!-创新互联
分享地址:http://scyanting.com/article/dcggip.html