1.引言

借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。

2.BigDecimal简介

BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。因此,BigDecimal表示的数值是(unscaledValue × 10-scale)

3Bigdecimal用法详解

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差,在处理庞大,复杂的运算时尤为明显,因根据实际需求决定使用哪种类型。

4DecimalFormat用法详解

DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。

DecimalFormat 包含一个模式 和一组符符号含义:

0 一个数字 
# 一个数字,不包括 0 
. 小数的分隔符的占位符 
, 分组分隔符的占位符 
; 分隔格式。 
- 缺省负数前缀。 
% 乘以 100 和作为百分比显示 
? 乘以 1000 和作为千进制货币符显示;用货币符号代替;如果双写,用 
国际货币符号代替。如果出现在一个模式中,用货币十进制分隔符代 
替十进制分隔符。 
X 前缀或后缀中使用的任何其它字符,用来引用前缀或后缀中的特殊字符。 

例子: 

DecimalFormat df1 = new DecimalFormat("0.0");
DecimalFormat df2 = new DecimalFormat("#.#");
DecimalFormat df3 = new DecimalFormat("000.000");
DecimalFormat df4 = new DecimalFormat("###.###");
System.out.println(df1.format(12.34));
System.out.println(df2.format(12.34));
System.out.println(df3.format(12.34));
System.out.println(df4.format(12.34)); 

结果: 
12.3 
12.3 
012.340 
12.34

附加:(java中常见保留2位小数点方法)

方式一:

四舍五入  
double   f   =   111231.5585;  
BigDecimal   b   =   new   BigDecimal(f);  
double   f1   =   b.setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue();  
保留两位小数  
---------------------------------------------------------------

方式二:

java.text.DecimalFormat   df   =new   java.text.DecimalFormat("#.00");  
df.format(你要格式化的数字);

例:new java.text.DecimalFormat("#.00").format(3.1415926)

#.00 表示两位小数 #.0000四位小数 以此类推...

方式三:

double d = 3.1415926;

String result = String .format("%.2f");

%.2f %. 表示 小数点前任意位数   2 表示两位小数 格式后的结果为f 表示浮点型

方式四:

NumberFormat ddf1=NumberFormat.getNumberInstance() ;

void setMaximumFractionDigits(int digits) 

digits 显示的数字位数 
为格式化对象设定小数点后的显示的最多位,显示的最后位是舍入的

import java.text.* ;
import java.math.* ;
class TT
{
public static void main(String args[])
{ double x=23.5455;
NumberFormat ddf1=NumberFormat.getNumberInstance() ; ddf1.setMaximumFractionDigits(2);
String s= ddf1.format(x) ;
System.out.print(s);
}

  

转载于:https://www.cnblogs.com/wxishang1991/p/5405664.html

java中商业数据计算时用到的类BigDecimal和DecimalFormat相关推荐

  1. Java向数据库中插入数据出错时怎么避免插入错误数据

    Java向数据库中插入数据出错时怎么避免插入错误数据 对于初学者,向数据库写数据时,当程序输错,会有错误的数据写入了数据库,这是可以用捕获异常回滚的方法避免这种情况的发生 代码如下: /** 完成增删 ...

  2. android listview 数据同步,android中ListView数据刷新时的同步方法

    本文实例讲述了android中ListView数据刷新时的同步方法.分享给大家供大家参考.具体实现方法如下: public class Main extends BaseActivity { priv ...

  3. visio中公式太小_visio绘图中的数据计算

    在绘流程图时,我们有时候会想直接在流程图上做计算,比如化工设计时精馏塔计算理论塔板数.在VISIO中,实现这个功能还是比较容易,举一个最简单的例子.如下图所示,等号后面的数字可以根据前面的数字变化. ...

  4. Java中重写equals()方法时注意点

    Java中重写equals()方法时注意点 一直说,重写一个对象的equals()方法时我们必须重写HashCode()方法,但是如果我们不重写呢?会有什么影响呢? 首先看一下,什么情况下我们需要重写 ...

  5. Java操作百万数据量Excel导入导出工具类(程序代码教程)

    Java操作百万数据量Excel导入导出工具类(程序代码教程): # 功能实现1.自定义导入数据格式,支持配置时间.小数点类型(支持单/多sheet)(2种方式:本地文件路径导入(只支持xls.xls ...

  6. java中使用jxl导出excel表格的工具类(全网唯一亲测可用,在原来基础上扩展)

    java中后台导出excel的话,有两种方案,一是使用poi(不过由于是windows版本的,存在不兼容,但功能更多,更强大),而是使用jxl(纯java编写,不过兼容,简单一些),可以设置输出的ex ...

  7. Java中在时间戳计算的过程中遇到的数据溢出问题

    背景 今天在跑定时任务的过程中,发现有一个任务在设置数据的查询时间范围异常,出现了开始时间戳比结束时间戳大的奇怪现象,计算时间戳的代码大致如下. package com.lingyejun.authe ...

  8. 从文件中读出数据显示在表格中_玩转表格:如何在Word表格中进行数据计算?...

    Word文档中的表格也可以进行数据运算的. 例如,要对表格中第1季度的数据进行求和计算时,具体操作方法如下. 1 第1步:将光标置于要输入合计值的单元格中,切换到[表格工具]栏中的[布局]选项卡中,在 ...

  9. Java中的数据类型转换

    Ťhis post was originally published on attacomsian.com/blog. 与PHP或JavaScript不同,Java是一种强类型的编程语言. 从本质上讲 ...

最新文章

  1. 【C】——线程引入 pthread_self 和 pthread_equal 原因 ——解决不同平台的问题!
  2. [Markdown] 数学公式
  3. 汽车常识全面介绍 - 车身
  4. Weblogic常见配置
  5. Redis中的哨兵机制的不足
  6. jboss8日志级别设置_罐中研讨会:设置JBoss BRMS全日研讨会
  7. ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题
  8. k2p华硕系统怎么设置_Linux怎么设置系统环境变量之export命令详解
  9. OpenSolaris安装JDK以及配置java开发环境
  10. 【MyBatis框架】Mybatis开发dao方法第二部分
  11. idea 查询项目代码行数_程序员的福利,四个技巧,让OneNote支持代码高亮
  12. c#制作发行版 vs_vs2019制作多项目工程模板 - Jackie Hao
  13. k8s中本地存储卷emptyDir、hostPath卷
  14. extmail mysql数据库 重启_配置extmail过程详解 | 学步园
  15. 内存超频时序怎么调_内存超频(ddr4内存时序多少为好)
  16. 万万没想到:西游篇--高速下载-12.19更新/真正可看的TC版/抢鲜版/高清版/超清版-高速下载
  17. Mothur5进阶_Mothur扩增子基因序列分析_基于OTU或ASV的多样性指数分析
  18. Microsoft OLE DB Provider for SQL Server 错误 ‘80004005‘错误原因和解决方案
  19. 计算机的休眠和睡眠时间在那调,电脑休眠状态跟睡眠状态的区别及唤醒方法
  20. MySql各版本介绍

热门文章

  1. 杭州水利水电学院计算机多少学,杭州的一所很容易考上的公办本科大学——浙江水利水电学院...
  2. 玄元剑仙服务器列表为空,玄元剑仙3月11日维护更新公告
  3. 【Zabbix】使用dbforbbix 2.2-beta监控Redhat 7.0上的Oracle、Mysql
  4. java事件大全_Java sctipt常用事件汇总介绍
  5. java原子引用怎么理解_Java 原子性引用 AtomicReference
  6. feign.RetryableException null executing post
  7. JRebel : java.lang.OutOfMemoryError: PermGen space 异常
  8. python 创建json_使用Django和Python创建Json response的方法
  9. 安卓设置菊花动画_Android仿ios加载loading菊花图效果
  10. 2000字详解 当Pandas遇上超大规模的数据集该如何处理呢?