BigDecimal用法详解-程序员宅基地

技术标签: java  随笔  api  BigDecimal  

一、简介
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。


二、构造器描述 
BigDecimal(int)       创建一个具有参数所指定整数值的对象。 
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 
BigDecimal(long)    创建一个具有参数所指定长整数值的对象。 
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。


三、方法描述 
add(BigDecimal)        BigDecimal对象中的值相加,然后返回这个对象。 
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。 
multiply(BigDecimal)  BigDecimal对象中的值相乘,然后返回这个对象。 
divide(BigDecimal)     BigDecimal对象中的值相除,然后返回这个对象。 
toString()                将BigDecimal对象的数值转换成字符串。 
doubleValue()          将BigDecimal对象中的值以双精度数返回。 
floatValue()             将BigDecimal对象中的值以单精度数返回。 
longValue()             将BigDecimal对象中的值以长整数返回。 

intValue()               将BigDecimal对象中的值以整数返回。

四、格式化及例子
由于NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制。
以利用BigDecimal对货币和百分比格式化为例。首先,创建BigDecimal对象,进行BigDecimal的算术运算后,分别建立对货币和百分比格式化的引用,最后利用BigDecimal对象作为format()方法的参数,输出其格式化的货币值和百分比。

public static void main(String[] args) {
    NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用 
    NumberFormat percent = NumberFormat.getPercentInstance();  //建立百分比格式化引用 
    percent.setMaximumFractionDigits(3); //百分比小数点最多3位 
    
    BigDecimal loanAmount = new BigDecimal("15000.48"); //贷款金额
    BigDecimal interestRate = new BigDecimal("0.008"); //利率   
    BigDecimal interest = loanAmount.multiply(interestRate); //相乘

    System.out.println("贷款金额:\t" + currency.format(loanAmount)); 
    System.out.println("利率:\t" + percent.format(interestRate)); 
    System.out.println("利息:\t" + currency.format(interest)); 
}

运行结果:

贷款金额:    ¥15,000.48
利率:    0.8%
利息:    ¥120.00

五、BigDecimal比较
BigDecimal是通过使用compareTo(BigDecimal)来比较的,具体比较情况如下:

public static void main(String[] args) {
    BigDecimal a = new BigDecimal("1");
    BigDecimal b = new BigDecimal("2");
    BigDecimal c = new BigDecimal("1");
    int result1 = a.compareTo(b);
    int result2 = a.compareTo(c);
    int result3 = b.compareTo(a);
    System.out.println(result1);
    System.out.println(result2);
    System.out.println(result3);
    
}

打印结果是:-1、0、1,即左边比右边数大,返回1,相等返回0,比右边小返回-1。
注意不能使用equals方法来比较大小。

使用BigDecimal的坏处是性能比double和float差,在处理庞大,复杂的运算时尤为明显,因根据实际需求决定使用哪种类型。



补充:

对于数据库中查询出来的BigDecimal加法

BigDecimal sum=new BigDecimal(Double.valueOf(0));
BigDecimal amount = accumulated.getAmount();
 sum=sum.add(amount);

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013126379/article/details/52672679

智能推荐

ROS-Kinect cv_bridge的opencv版本兼容问题_ros自带opencv和本地opencv版本冲突问题解决-程序员宅基地

文章浏览阅读1.1w次,点赞8次,收藏27次。今天在编译自己的drone_sensor模块的时候(含stereo camera)出现了/home/joey/pfl/ros/src/drone_sensor/src/stereo_camera/CameraThread.cpp: In member function ‘virtual void CameraThread::loop()’: /home/joey/pfl/ros/src/drone__ros自带opencv和本地opencv版本冲突问题解决

USB转串口 FT232/PL2303/CH340 驱动以及使用体会_ft232pl 驱动-程序员宅基地

文章浏览阅读1.2k次。emouse原创文章,转载请注明出处http://www.cnblogs.com/emouse/现在笔记本上很少带有串口了,而串口又是做电子设计必备的通讯接口之一,好在USB转串口比较方便,市面上常用的USB转串口芯片有很多,最常见的有FT232、PL2303、CH340三种,这三种我分别说一下,同时整理一下他们的驱动程序,网上找驱动程序的很多,也有很多人发布,找驱动程序当然要去官网找了,这样_ft232pl 驱动

POJ 1679 The Unique MST( 判断最小生成树是否唯一)-程序员宅基地

文章浏览阅读559次。题目链接:http://poj.org/problem?id=1679解题思路:1.首先求出原图的最小生成树,并将此生成树的每条边作标记;2.每次只删除其中一条边,再求最小生成树,观察结果与最开始的是否一致,是则不唯一;3.当所有被标记的边都被删过一次后,如果没有一次结果与最开始的一致,则是唯一的。AC代码:#include #include #include

Trees on the level UVA - 122(建树+bfs)_输入相邻节点,建树-程序员宅基地

文章浏览阅读102次。题意:输入文件尾个序列形如(data,左子树or 右子树),然后让你层次遍历它,如果出现存在某个节点的父节点不存在或者某个节点出现多次,输出:not complete。难点:输入和建树wa了一次貌似是没有把树释放。然后学到两个函数sscanf(&s[1],"%d",&v);//从char[]中第1个元素开始中的数字部分读入int型变量vstrchr(s,’,’)+1//..._输入相邻节点,建树

可用性提升大作战-Redis的高可用策略之Sentinel_redis sentinel 读策略-程序员宅基地

文章浏览阅读209次。纲要Redis高可用技术说明正文1. 哨兵1.1 架构1.2 工作流程1.2.1 健康检测1.2.2 主观下线1.2.3 客观下线1.2.4 选举1.2.5 故障转移1.2.6 通知1.2.7 关于中断1.3 算法分布式一致性算法Raft算法1.4 缺陷1.4.1 关于脑裂1.4.2 异步复制的数据丢失问题其他解决方案参考资料Redis高可用技术说明由于本人技术能力较为有限,无法支撑独立成文..._redis sentinel 读策略

【BZOJ2959】长跑(Link-Cut Tree,并查集)_link-cut tree 并查集-程序员宅基地

文章浏览阅读193次。题面BZOJ题解如果保证不出现环的话 妥妥的LCTLCT傻逼题现在可能会出现环 环有什么影响? 那就可以沿着环把所有点全部走一遍吧 所以,相当于把环看成一个点来搞一搞所以,维护一个并查集 记录一下每个点被缩成了哪个点 然后再用LCTLCT维护缩点后的树就行啦#include#include#include#include

随便推点

阿里巴巴,果然开始拥有“预测未来”的能力了_adb 阿里巴巴-程序员宅基地

文章浏览阅读2.4k次。顶灯闪烁,笛声响彻。救护车载着病人,冲向茫茫车海,在时间的赛道上狂奔。高德地图、GPS 卫星导航、路面磁感线圈、1300 个路口摄像头同时开动,为这辆救护车勘探最快路线;GPS 传回实时数据,后台根据辅助数据纠偏,锚定救护车每一刻的精确位置;救护车将要经过的沿途,车辆情况被实时计算。确保路口绿灯提前亮起,在救护车通过之前,刚好所有社会车辆已经行驶一空。这不是演习,这是杭州城..._adb 阿里巴巴

二、MySQL数据库(多表)(1)-程序员宅基地

文章浏览阅读58次。文章目录1 多表关系1.1 外键引入1.2 表与表之间的关系2 多表查询2.1 交叉连接查询2.2 常用的多表查询方式2.3 内连接查询2.4 外连接查询2.5 子查询3 索引3.1 索引概述3.2 索引优势劣势3.3 索引结构3.4 索引分类3.5 索引语法1 多表关系1.1 外键引入1 外键特点:从表外键的值是对主表主键的引用。从表外键类型,必须与主表主键类型一致。2 声明外键约束 :语法: alter table 从表名 add constraint f

代码生成工具 AutoCode For XML发布_xml 图形化 生成工具-程序员宅基地

文章浏览阅读454次。AutoCode For XML介绍软件名称:XML设计及解析代码生成工具软件。此软件用于辅助程序开发人员进行图形化XML设计,并提供针对目标编程语言,自动生成XML解析代码的功能,实现设计即编码,减轻开发者负担。很多实际项目都需要使用XML保存程序配置。XML解析编码工作,技术固定、劳动量较大,写起来有些枯燥而且手写容易出错,编码+调试的时间加起来不能算少。如果这些相对固定的编码工作能够计算机自动完成,那么开发者将节省很多时间精力,而节省下来的时间精力可以投入到更有意义的事情上去。于是AutoCo_xml 图形化 生成工具

Jordan 标准型的实例-程序员宅基地

文章浏览阅读1.6w次,点赞17次,收藏79次。将学习到什么练习一下如何把一个矩阵化为 Jordan 标准型.将矩阵化为 Jordan 标准型需要三步:第一步 求出矩阵 \(A \in M_n\) 全部的特征值 \(\lambda_1,\cdots,\lambda_t\), 假设有 \(t\) 个不同的特征值第二步 Jordan 标准型定理 中的推论告诉我们:\(w_k(A,\lambda)-w_{k+1}(A,\lambda)..._jordan标准型求法经典例题

docker run -it centos /bin/bash 后面的 bin/bash的作用-程序员宅基地

文章浏览阅读2.1w次,点赞29次,收藏52次。首先,docker run -it centos 的意思是,为centos这个镜像创建一个容器 -it就等于 -i和-t,这两个参数的作用是,为该docker创建一个伪终端,这样就可以进入到容器的交互模式?(也就是直接进入到容器里面) 后面的/bin/bash的作用是表示载入容器后运行bash,docke...

ROS工作空间和通信编程_ros loop-程序员宅基地

文章浏览阅读312次。一. 什么是工作空间:我们开发时会把所有的代码文件、解释文档等各种东西放在一个文件夹下,这个存放工程开发所涉及到的文件夹可以称作是一个工作空间。#mermaid-svg-tnqYjE3i1jdIQXvr .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-tnqYjE3i1jdIQXvr .label text{_ros loop