一、介绍

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对象中的值以整数返回。

下面是一个工具类,该工具类提供加,减,乘,除运算。

public class Arith {  /** * 提供精确加法计算的add方法 * @param value1 被加数 * @param value2 加数 * @return 两个参数的和 */  public static double add(double value1,double value2){  BigDecimal b1 = new BigDecimal(Double.valueOf(value1));  BigDecimal b2 = new BigDecimal(Double.valueOf(value2));  return b1.add(b2).doubleValue();  }  /** * 提供精确减法运算的sub方法 * @param value1 被减数 * @param value2 减数 * @return 两个参数的差 */  public static double sub(double value1,double value2){  BigDecimal b1 = new BigDecimal(Double.valueOf(value1));  BigDecimal b2 = new BigDecimal(Double.valueOf(value2));  return b1.subtract(b2).doubleValue();  }  /** * 提供精确乘法运算的mul方法 * @param value1 被乘数 * @param value2 乘数 * @return 两个参数的积 */  public static double mul(double value1,double value2){  BigDecimal b1 = new BigDecimal(Double.valueOf(value1));  BigDecimal b2 = new BigDecimal(Double.valueOf(value2));  return b1.multiply(b2).doubleValue();  }  /** * 提供精确的除法运算方法div * @param value1 被除数 * @param value2 除数 * @param scale 精确范围 * @return 两个参数的商 * @throws IllegalAccessException */  public static double div(double value1,double value2,int scale) throws IllegalAccessException{  //如果精确范围小于0,抛出异常信息  if(scale<0){           throw new IllegalAccessException("精确度不能小于0");  }  BigDecimal b1 = new BigDecimal(Double.valueOf(value1));  BigDecimal b2 = new BigDecimal(Double.valueOf(value2));  return b1.divide(b2, scale).doubleValue();      }
} 

四、常用方法集锦

scale()   小数点后的位数

BigDecimal.setScale()方法用于格式化小数点
setScale(1)表示保留一位小数,默认用四舍五入方式 
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3 
setScale(1,BigDecimal.ROUND_UP)进位处理(进一法),2.35变成2.4 
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4

setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍

setScaler(1,BigDecimal.ROUND_CEILING)接近正无穷大的舍入

setScaler(1,BigDecimal.ROUND_FLOOR)接近负无穷大的舍入,数字>0和ROUND_UP作用一样,数字<0和ROUND_DOWN作用一样

setScaler(1,BigDecimal.ROUND_HALF_EVEN)向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

五、格式化

NumberFormat是所有数值格式的抽象基类。此类提供格式化和解析数值的接口,可用于格式化和解析任何语言环境的数值。使代码能够完全独立于小数点、千位分隔符甚至所用特定小数位数的语言环境约定,并与数值格式是否为偶小数无关。

getInstance 或 getNumberInstance 获取常规数值格式。
getIntegerInstance 只保留整数数值格式。
getCurrencyInstance 获取货币数值格式。
getPercentInstance 获取显示百分比的格式。使用此格式,小数 0.53 将显示为 53%。
setMinimumFractionDigits 控制数值的显示。

/** * 格式化 */
@Test
public void test3() {  NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用  NumberFormat percent = NumberFormat.getPercentInstance();  //建立百分比格式化引用  percent.setMaximumFractionDigits(3); //百分比小数点最多3位  BigDecimal loanAmount = new BigDecimal("150.48"); //贷款金额  BigDecimal interestRate = new BigDecimal("0.008"); //利率  BigDecimal interest = loanAmount.multiply(interestRate); //相乘  System.out.println("贷款金额:\t" + currency.format(loanAmount)); //贷款金额: ¥150.48  System.out.println("利率:\t" + percent.format(interestRate));  //利率: 0.8%  System.out.println("利息:\t" + currency.format(interest)); //利息: ¥1.20
}
@Test
public void test3() {  DecimalFormat df = new DecimalFormat();  double data = 1234.56789; //格式化之前的数字  //1、定义要显示的数字的格式(这种方式会四舍五入)  String style = "0.0";  df.applyPattern(style);  System.out.println("1-->" + df.format(data));  //1234.6  //2、在格式后添加诸如单位等字符  style = "00000.000 kg";  df.applyPattern(style);  System.out.println("2-->" + df.format(data));  //01234.568 kg  //3、 模式中的"#"表示如果该位存在字符,则显示字符,如果不存在,则不显示。  style = "##000.000 kg";  df.applyPattern(style);  System.out.println("3-->" + df.format(data));  //1234.568 kg  //4、 模式中的"-"表示输出为负数,要放在最前面  style = "-000.000";  df.applyPattern(style);  System.out.println("4-->" + df.format(data)); //-1234.568  //5、 模式中的","在数字中添加逗号,方便读数字  style = "-0,000.0#";  df.applyPattern(style);  System.out.println("5-->" + df.format(data));  //5-->-1,234.57  //6、模式中的"E"表示输出为指数,"E"之前的字符串是底数的格式,  // "E"之后的是字符串是指数的格式  style = "0.00E000";  df.applyPattern(style);  System.out.println("6-->" + df.format(data));  //6-->1.23E003  //7、 模式中的"%"表示乘以100并显示为百分数,要放在最后。  style = "0.00%";  df.applyPattern(style);  System.out.println("7-->" + df.format(data));  //7-->123456.79%  //8、 模式中的"\u2030"表示乘以1000并显示为千分数,要放在最后。  style = "0.00\u2030";  //在构造函数中设置数字格式  DecimalFormat df1 = new DecimalFormat(style);  //df.applyPattern(style);  System.out.println("8-->" + df1.format(data));  //8-->1234567.89‰
}

六、比较大小

BigDecimal是通过使用compareTo(BigDecimal)来进行两个BigDecimal比较的

public void testCompare(){BigDecimal a=new BigDecimal("20");a.compareTo(b)==1;   //a>ba.compareTo(b)==-1;  //a<ba.compareTo(b)==0;   //a=ba.compareTo(b)<1;    //a<=ba.compareTo(b)>-1;   //a>=b}

6.1 科学计数法

@Test
public void test5() {  BigDecimal bd = new BigDecimal("3.40256010353E11");  String result = bd.toPlainString();  System.out.println(result);  //340256010353
}  

6.2  处理价格中逗号

@Test
public void test1() {  java.util.StringTokenizer st = new StringTokenizer( "123,456,789", ",");  StringBuffer sb = new StringBuffer();  while(st.hasMoreTokens())   {  sb.append(st.nextToken());  }  System.out.println(sb);  //123456789
}  @Test
public void test2() {  String str = "123,456,789";  str = str.replace(",", "");  System.out.println(str);  //123456789
}  

BigDecimal 运算及取小数位相关推荐

  1. 取模运算和取余运算的区别

    先说结论:取模和取余在计算的目标上是一致的,只是商的不同,导致结果不同,取余和取模在被除数.除数同号时,结果是等同的,异号时会有区别. 那么 Why? 取模,取余是怎样计算的 在计算机中,对于整型数a ...

  2. BigDecimal运算的工具类

    使用BigDecimal运算的工具类 package com.leo.demo.bigdecimaltest;/*** @ClassName: BigDecimalTest* @Description ...

  3. java:数学运算的取最大、最小、绝对值的函数方法

    数学运算的取最大.最小.绝对值的函数方法 相关说明 源码 运行结果 相关说明 方法Math.A A为数学方法 数学方法: min(a,b) ········a到b的最小值 max(c,d) ····· ...

  4. Java中「与运算,或运算,异或运算,取反运算。」

    Java中「与运算,或运算,异或运算,取反运算.」 文章目录 Java中「与运算,或运算,异或运算,取反运算.」 Java中的「与运算(AND) & 」 规则 :都为1时才为1,否则为0 Ja ...

  5. Python 取模运算(取余)%误区及详解

    Python 取模运算(取余)%误区及详解 首先,必须要先明确一个概念(针对新手),不要用数学求余数角度来思考模运算,python.Java等各种语言都有其不同的运行机制. python的模运算计算规 ...

  6. c语言里取余数的运算的代码,Math——取模运算及取余运算(示例代码)

    取模运算及取余运算 取余运算(Complementation)即我们小学时学的数学算术概念,而取模运算(Modulus Operation)常用于程序设计中 公式 a%b = a - (a/b * b ...

  7. 演示多组int,float,double的数与 2,2.0f,2.0d的除法运算和取模运算,如有兴趣,可自行分析对比结果

    因为各种基本数据类型所占用的存储空间各不相同,所以在进行各种计算时,有可能存在精度题.计算机的操作要在内存中进行,而内存容量有限:另一方面,持久化存储设备的存储空间也有限,内存中的数据可能需要持久化保 ...

  8. mysql取余 和 取模_java 取模运算% 实则取余 简述 例子 应用在数据库分库分表

    java 取模运算%  实则取余 简述 例子 应用在数据库分库分表 求模运算与求余运算不同."模"是"Mod"的音译,模运算多应用于程序编写中. Mod的含义为 ...

  9. 与运算和取余运算的配对条件

      偶然在一个算法解析中,看到作者用与运算来代替取余运算,感觉属实有点装逼,于是有了钻研一下的想法.   首先通过实验来看看,与运算和取余运算存在一个怎样的关系. for i in range(100 ...

最新文章

  1. 狄利克雷卷积莫比乌斯反演证明
  2. C/S架构程序多种类服务器之间实现单点登录(转)
  3. Web前端工程师应该懂的的知识点——HTML/CSS
  4. android 双时区,理查德米勒推出RM 11-02自动机芯双时区飞返计时码表
  5. python调用pyd_Python生成pyd文件
  6. [转] 移动前端不得不了解的HTML5 head 头标签
  7. 程序员太牛了 公司年会整成代码讨论会
  8. 想做大数据的,可以看看这个学习路线,超全!
  9. 信息学奥赛一本通 1026:空格分隔输出 | OpenJudge NOI 1.1 06
  10. Vue | 实现页面跳转刷新,在Vue页面中调用其他页面的方法
  11. mongodb java驱动_Java操作MongoDB之mongodb-driver(一)
  12. BP神经网络分类实例(神经网络编程入门 )
  13. matlab breline,linebreak_header must be terminated by a line break怎么解决
  14. asp.net 为FCKeditor开发代码高亮插件实现代码
  15. 神州数码交换机CS6200命令(信息安全管理与评估赛项)
  16. LM317的直流可调稳压电源Multisim仿真设计(附仿真+论文+参考资料)
  17. SEO:让网站收录更好的十个方法 网站一直不被收录怎么办
  18. 【Day5.3】斯里兰卡风格的崖差蒙空寺
  19. 山东理工大学ACM平台题答案关于C语言 1228 两数组最短距离
  20. Cookie.js 源码解析

热门文章

  1. AIX各项知识链接(IBM官网)
  2. 李岳恒: 区块链媒体的罗生门:要不要做APP?
  3. Docker可视化工具
  4. 基于Java毕业设计银行招聘系统设计源码+系统+mysql+lw文档+部署软件
  5. Springboot+采用协同过滤算法的视频推荐系统的设计与实现 毕业设计-附源码261620
  6. 使用Pro Event Calendar插件将日历插入WordPress
  7. 身体指数bmi流程图_BMI指数事关重大,你家娃合不合格赶紧来对表查!
  8. Elasticsearch学习1 入门进阶 Linux系统下操作安装Elasticsearch Kibana 初步检索 SearchAPI Query DSL ki分词库 自定义词库
  9. Mybatis Plus最新代码生成器AutoGenerator,更简单更高效!
  10. MPS和MRP的区别