Java中BigDecimal类的使用详解
作者:Red_Ant_hoyl 发布时间:2021-12-13 05:30:52
不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
一、BigDecimal转换取Double数据
假设我们有一个数据是:
Double num = 123456789.98;
我们用java怎么取到这个数值呢。
经过笔者测试:
Double num = 123456789.98;
BigDecimal bg1=new BigDecimal(num);
BigDecimal bg2=new BigDecimal(num + "");
System.err.println(num);
System.err.println(bg1);
System.err.println(bg2);
我们得到:
所以呢,取Double数据的方法是:
Double num = 123456789.98;
BigDecimal bg2=new BigDecimal(num + "");
二、BigDecimal去掉科学计数法
java.text.NumberFormat NF = java.text.NumberFormat.getInstance();
NF.setGroupingUsed(false);//去掉科学计数法显示
System.err.println("d:="+NF.format(num));
三、BigDecimal的加法减法乘法除法运算。
常规我们想到的加法:
Double aa = num + num;
System.err.println(aa);
BigDecimal bb =new BigDecimal(aa + "");
System.err.println(bb);
快拿计算机算算,是对的吧。
接下来咱们看,正规一点的写法
BigDecimal b1 = new BigDecimal(Double.toString(num));
BigDecimal b2 = new BigDecimal(Double.toString(num));
System.err.println(b1.add(b2).doubleValue());
BigDecimal cc =new BigDecimal(b1.add(b2).doubleValue());
System.err.println(cc);
就测试结果而言呢,还是按照我们常规的想法走吧。
b1.subtract(b2).doubleValue();//减法
b1.multiply(b2).doubleValue();//乘法
b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();//除法
四、接下来,我们测试最后一个乘法
这个精度可能超出了Double的精度,我们减小一下
6789.98 x 6789.98 =46103828.4004
上代码测试:
常规:
Double num = 6789.98;
Double dd = num * num;
System.err.println(dd);
BigDecimal ee =new BigDecimal(dd + "");
System.err.println(ee);
精确:
Double yysds = 6789.98;
BigDecimal b1 = new BigDecimal(Double.toString(yysds));
BigDecimal b2 = new BigDecimal(Double.toString(yysds));
System.err.println(b1.multiply(b2).doubleValue());
BigDecimal cc =new BigDecimal(b1.multiply(b2).doubleValue());
System.err.println(cc);
上结果
看来涉及小数的计算,还是需要留意的。
其实笔者总结:取Double的值,转化一下。计算的时候就按照常规的方法来计算,只是取值的时候转一下。
来源:https://blog.51cto.com/13479739/2164139


猜你喜欢
- 沉浸式状态栏的来源就是很多手机用的是实体按键,没有虚拟键,于是开了沉浸模式就只有状态栏消失了。于是沉浸模式成了沉浸式状态栏。我们先来看下具体
- 以前的左右滑动效果采用自定义scrollview或者linearlayout来实现,recyclerview可以很好的做这个功能,一般的需求
- 如果对空的对象进行操作,就会造成意外错误。所以我们在使用对象前,一般会进行非空判断接下来介绍我知道的三种判断非空方法:1、if判断这个最直接
- 栈栈(stack)又名堆栈,它是一种运算受限的线性表 。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。
- 一、绘制背景绘制背景的方法有两种:自己利用canvas进行绘制利用view的自带方法进行绘制1.1 canvas绘制背景自己绘制的背景的方法
- 一、解决方案1声明:jdk1.8已经经过线上环境使用1. 调研JDK8的加密策略存在限制版本和无限制版本,随着越来越多的第三方工具只支持 J
- Android静默安装的方法,静默安装就是绕过安装程序时的提示窗口,直接在后台安装。注意:静默安装的前提是设备有ROOT权限。代码如下:/*
- 前言各位小伙伴大家好,我是A哥。IDEA上个较大版本的发布,要追溯到4月份了:时隔近4个月,北京时间2020-07-28深夜,Intelli
- axMapControl1是主控件,axMapControl2是鹰眼控件要看清楚事件响应 1.鹰眼地图资源载入privatevoi
- 1.aar包是android studio下打包android工程中src、res、lib后生成的aar文件,aar包导入其他android
- 项目中常用到的圆形进度条有好多个,从网上搜到的自定义进度条多是封装的比较好的代码,但是不利于初学者,现在本博客就教给大家如何一步步实现自定义
- Mybatis Log Plugin使用今天发现大部分猿友关于查看执行sql语句的方法,只知道将其输出到控制台。然而还有更简便的方法,就是使
- 在整合SpringBoot和Mybatis-plus时,想写自定义的sql,所以创建了Mapper.xml文件,但是启动后却老是报错:org
- 我们都知道, Android EditText输入框,并没有监听用户输入完成的功能,需要我们自己实现。 下面是实现的方法,仅供参考:Edit
- struct InputStream 是单个输入流的管理器。是由 add_input_stream() 函数申
- 记录使用Scroller实现平滑滚动,效果图如下:一、自定义View中实现View的平滑滚动public class ScrollerVie
- 本文实例讲述了Android读取assets目录下的所有图片并显示的方法。分享给大家供大家参考。具体方法分析如下:在assets文件夹里面的
- 今天的几个目标: 1. 自定义ActionProvider 2. Toolbar ActionBar自定义Menu 3. Toolbar A
- Android中实现拍照有两种方法,一种是调用系统自带的相机,然后使用其返回的照片数据。 还有一种是自己用Camera类和其他相关类实现相机
- 前言:OpenFeign 是 Spring 官方推出的一种声明式服务调用和负载均衡组件。它的出现就是为了替代已经进入停更维护状态的 Feig