当前位置:首页 > Java技术 > 使用BigDecimal运算结果老是为0?老是没作用?来看看BigDecimal运算的正确姿势吧!

使用BigDecimal运算结果老是为0?老是没作用?来看看BigDecimal运算的正确姿势吧!

2022年08月04日 17:53:09Java技术6

BigDecimal是开发中经常使用到的类,在涉及金额相关的字段时,精度要求是非常严格的,这也是不用double的原因了。没用过的开发者通常会遇到一个问题,就是**经过一通计算,没有得到预期的结果,得到的还是原来未参与运算的那个值。**通常大家看到最多的就是0。

这个问题我们从代码上来看是看不出来的,要想知道前因后果就需要看看BigDecimal的加,减,乘,除都是如何计算的,下面我们来看看BigDecimal源码吧!
使用BigDecimal运算结果老是为0?老是没作用?来看看BigDecimal运算的正确姿势吧! _ JavaClub全栈架构师技术笔记
使用BigDecimal运算结果老是为0?老是没作用?来看看BigDecimal运算的正确姿势吧! _ JavaClub全栈架构师技术笔记

通过乘法为例,上图中的BigDecimal multiply((BigDecimal multiplicand)(把整个方法都写出来是为了区别后面的同名方法)方法返回的结果是调用了另一个方法BigDecimal multiply(long x, long y, int scale),我们看下方的图可以发现,最终返回的结果是new了一个新的BigDecimal对象。也就是说使用BigDecimal的加减乘除方法时,需要重新接收一下计算的结果。

上面这段话有些人可能会理解,但是有些人估计还是蒙的。理解的就不用往下看了,不理解的看看下面的代码及运行结果:

使用BigDecimal运算结果老是为0?老是没作用?来看看BigDecimal运算的正确姿势吧! _ JavaClub全栈架构师技术笔记

示例中创建了一个BigDecimal对象,值为32。看第8行代码(就是大家出错的写法),这个时候我们期望输出的是32 * 2 = 64,偏偏运行结果是32。解释一下:第7行有一个BigDecimal对象,它的值是32;第8行一整行是一个BigDecimal对象(因为内部返回的结果是重新new的),这个对象没有名字。所以第9行输出的就是第7行的值。

接下来第10行就比较好理解了,我把32 * 2 的值赋值给了第7行声明的BigDecimal对象。第7行的值由32变成了64。

最后解释一下为什么大家看到最多的是0,原因是我们计算时大家都会先声明一个BigDecimal对象用于记录计算结果,一般初始化时大家给的值都是0,结合上面的示例就是大家初始化的时候不会写32,而是写0。所以测试时看到0居多。

作者:Evader1997
来源链接:https://blog.csdn.net/qq_42396796/article/details/112285130

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/17223.html

标签: BigDecimal
分享给朋友:

“使用BigDecimal运算结果老是为0?老是没作用?来看看BigDecimal运算的正确姿势吧!” 的相关文章

Java 使用BigDecimal进行高精度加减乘除

有时候我们计算金钱或者其他一些计算的时候需要高精度的计算加减乘除,可以使用BigDecimal 加: BigDecimal num1 = new BigDecimal("100.569"); BigDecimal num2 = new Big...

[转]BigDecimal使用(整理)

原文地址:https://www.jianshu.com/p/2947868d76eb 应用场景 大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。比如:货币 使用 1、构建BigDecima...

BigDecimal 与 doubleValue 的使用 ,以及四舍五入

/** * 保存发票信息 * @param controller * @return * @throws ParseException * @throws ActiveRecordException */ @...

BigDecimal转为int类型

BigDecimal转为int类型

直接调用BigDecimal的intValue()方法 示例: BigDecimal a = new BigDecimal(“1.1”); int b = a.intValue(); BigDecimal运算方法:...

Java BigDecimal

1构造函数(主要测试参数类型为double和String的两个常用构造函数)        BigDecimal aDouble =new BigDecimal(1.22);  &nb...

【java提高】(19)---BigDecimal详解和精度问题

【java提高】(19)---BigDecimal详解和精度问题

BigDecimal详解和精度问题 一、背景 在实际开发中,对于 不需要任何准确计算精度的属性可以直接使用float或double,但是如果需要精确计算结果,则必须使用BigDecimal,例如价格、质量。 为什么这么说,主要有两点...

BigDecimal去除小数位

String cellValue = ""; double numericCellValue = cell.getNumericCellValue(); BigDecimal bd2...

java定义Bigdecimal类型

Java常用类型定义、转换及比较主要有以下三个方面: (一)Integer类型 1).定义 Integer a=new Integer(int value); Integer a=new Integer(String value); 2).转换 i.定义中就可以将int...

BigDecimal 百分比转换

public static void main(String[] args) { BigDecimal bigDecimalCount = BigDecimal.valueOf(1); BigDecimal bigDecimalTotal...

BigDecimal常被忽略的问题

BigDecimal常被忽略的问题

  一:相除精度丢失的问题   BigDecimal的api除法相对加减乘要实现的复杂多了,只介绍常用的我遇到的问题:   问题:两数相除,如果9/3=3整除没问题,但是10/3=0.33333333......除不尽,这里不能让电脑一直除不尽,所以BigD...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。