用BigDecimal计算金额就高枕无忧了?带你了解BigDecimal这5个坑

导读:本篇文章讲解 用BigDecimal计算金额就高枕无忧了?带你了解BigDecimal这5个坑,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

BigDecimal是java.math包中提供的API类,专门用于对超过16位有效位的数进行精确的运算。一般情况下,对于不需要准确精度的计算,我们可以通过float或者double进行计算,但是如果需要精确计算的结果,就必须使用BigDecimal类来操作。

而BigDecamal本质上是一个对象,所以传统的+、-、*、/等算术运算符就不能直接使用了。

今天我们来了解一下,使用BigDecimal时容易踩的五个坑。

1,错误的初始化

用BigDecimal计算金额就高枕无忧了?带你了解BigDecimal这5个坑

BigDecimal提供了很多初始化方法,但是需要注意的是,当我们使用double这种浮点型初始化,可能得到预期外的结果。

用BigDecimal计算金额就高枕无忧了?带你了解BigDecimal这5个坑

当我们使用浮点型进行初始化时,由于其本身就是一个不确定的值,传给BigDecimal初始化时已经丢失了精度,所以看起来就像一个bug。

一般来说,建议大家初始化时将其转为String或者使用BigDecimal.valueOf方法。

用BigDecimal计算金额就高枕无忧了?带你了解BigDecimal这5个坑

2,错误的等值比较方法

用BigDecimal计算金额就高枕无忧了?带你了解BigDecimal这5个坑

equal方法会比较两个BigDecimal对象的精度,如果精度不同,则认为是两个不同的对象。

如果要比较两个对象的大小,建议使用compareTo方法。

3,未指定精度可能会导致异常

用BigDecimal计算金额就高枕无忧了?带你了解BigDecimal这5个坑

如果除法的商是一个无限小数,而我们又没有指定精度大小,程序将抛出一个异常。当我们使用BigDecimal时,应该时刻记得指定精度,避免因为精度问题带来的损失。

4,toString方法的格式问题

当我们想把一个BigDecimal.valueOf构造的BigDecimal转为String时,应该了解到toString方法和toPlainString方法的区别。

toString:必要时会使用科学计数法。

toPlainString:不使用科学计数法。

toEngineeringString:工程计算中经常使用的记录数字的方法,与科学计数法类似,但要求10的幂必须是3的倍数。

5,执行顺序不同导致的结果差异

用BigDecimal计算金额就高枕无忧了?带你了解BigDecimal这5个坑

当执行算术运算时,会满足乘法交换律,但是对于BigDecimal来说,是不适用的。

不同的执行顺序会得到不同的结果,对于金融类的需求,这0.1的差额,足够你排除bug到半夜了。

总结

1,BigDecimal虽然计算精度准确,但是其性能相对double,float是较差的。如果没有高精度计算的要求,那也不必强行使用BigDecimal。

2,初始BigDecimal时,建议强制使用字符串的构造参数。

3,BigDecimal对象是不可变的,每次计算都会产生一个新对象,所以记得保存做完计算以后的值。

感谢您的点赞和关注。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84836.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!