BigDecimal类(高精度小数)

位置:java.math.BigDecimal

作用:提供高精度小数数据类型及相关操作

一、基本介绍

  • BigDecimal为不可变的、任意精度的有符号十进制数,其值为(unscaledValue * 10-scale)其中,unscaledValue(非标度值)为任意精度的整数、scale(标度)为32位整型(可为负)
  • 提供以下操作:算术标度操作舍入比较哈希算法格式转换
  • 用户能通过提供MathContext对象完全控制BigDecimal的舍入行为(也可使用类内提供的8种舍入模式)。如果未指定舍入模式,并且无法表示准确结果,则抛出一个异常。
  • 由于同一数值可以有不同的表示形式(具有不同的标度),因此运算和舍入的规则必须同时指定数值结果和结果表示形式中所用的标度。
  • 一般情况下,当准确结果(在除法中,可能有无限多位)比返回的数值具有更多位数时,舍入模式和精度设置确定操作如何返回具有有限位数的结果(MathContextprecision 设置指定要返回的总位数,这确定了结果的精度、位数计数从准确结果的最左边的非零数字开始、舍入模式确定丢弃的尾部位数如何影响返回的结果)。
  • 对于所有算术运算符,运算的执行方式是,首先计算准确的中间结果,然后,使用选择的舍入模式将其舍入为精度设置(如有必要)指定的位数。如果不返回准确结果,则将丢弃准确结果的某些数位。当舍入增加了返回结果的大小时,前导数字“9”的进位传播可能会创建新的数位。例如,将值 999.9 舍入为三位数字,则在数值上等于一千,表示为 100×101。在这种情况下,新的 "1" 是返回结果的前导数位。
  • 除了逻辑的准确结果外,每种算术运算都有一个表示结果的首选标度
    • 加法:max( addend.scale() , augend.scale() )  //加数与被加数中的较大者
    • 减法:max( minuend.scale() , subtrahend.scale() )  //被减数与减数之间的较大者
    • 乘法:multiplier.scale() + multiplicand.scale()  //乘数与被乘数的和
    • 除法:dividend.scale() - divisor.scale()  //被除数与除数的差

二、字段

BigDecimal常量

  1. static BigDecimal ONE  //值为 1,标度为 0
  2. static BigDecimal TEN  //值为 10,标度为 0
  3. static BigDecimal ZERO  //值为 0,标度为 0

舍入模式

  1. static int ROUND_UP   //(常量字段值0)远离零的舍入模式(向上舍入)。舍弃某部分时,若舍弃部分非零则对其前面的数字加1(此舍入模式始终不会减少计算值的大小)
  2. static int ROUND_DOWN   //(常量字段值1)接近零的舍入模式(向下舍入)。直接丢弃需舍弃部分(此舍入模式始终不会增加计算值的大小)
  3. static int ROUND_CEILING   //(常量字段值2)接近正无穷大的舍入模式。若BigDecimal为正,则舍入行为同ROUND_UP;若为负,则舍入行为同ROUND_DOWN(此舍入模式始终不会减少计算值大小)
  4. static int ROUND_FLOOR   //(常量字段值3)接近负无穷大(不是无穷小哦)的舍入模式。其行为与ROUND_CEILING相反,若BigDecimal为负,则舍入行为同ROUND_UP;若为正,则舍入行为同ROUND_DOWN(此舍入模式始终不会增加计算值大小)
  5. static int ROUND_HALF_UP   //(常量字段值4)向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式(四舍五入,即舍弃部分>=0.5则向上舍入,否则向下舍入)
  6. static int ROUND_HALF_DOWN   //(常量字段值5)向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向下舍入的舍入模式(舍弃部分<=0.5则向下舍入,否则向上舍入)
  7. static int ROUND_HALF_EVEN   //(常量字段值6)向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入(在重复进行一系列计算时,此舍入模式可以将累加错误减到最小)
  8. static int ROUND_UNNECESSARY   //(常量字段值7)断言请求的操作具有精确的结枚,因此不需要舍入,若该操作无精确结果(如1/3)则抛出 ArithmeticException

三、生成BigDecimal对象

构造方法

  1. BigDecimal(String val)  //将 BigDecimal 的字符串表示形式转换为 BigDecimal(可为科学计数法表示、可带前导负号),其标度值为字符串的小数部分数字位数(没有小数点则标度为0)
  2. BigDecimal(String val, MathContext mc)  //将 BigDecimal 的字符串表示形式转换为 BigDecimal,接受与 BigDecimal(String) 构造方法相同的字符串,并按照上下文设置进行舍入
  3. BigDecimal(BigInteger val)  //将 BigInteger 转换为 BigDecimal(其标度为0)
  4. BigDecimal(BigInteger val, MathContext mc)  //将 BigInteger 转换为 BigDecimal(其标度为0),并根据上下文设置进行舍入
  5. BigDecimal(BigInteger unscaledVal, int scale)  //将 BigInteger 非标度值和 int 标度转换为 BigDecimal
  6. BigDecimal(BigInteger unscaledVal, int scale, MathContext mc)  //将 BigInteger 非标度值和 int 标度转换为 BigDecimal,并根据上下文设置进行舍入
  7. BigDecimal(char[] in)  //将 BigDecimal 的字符数组表示形式转换为 BigDecimal,接受与 BigDecimal(String) 构造方法相同的字符序列(如果字符序列已经可以作为一个字符数组使用,则使用此构造方法要比将 char 数组转换为字符串并使用 BigDecimal(String) 构造方法更快)
  8. BigDecimal(char[] in, MathContext mc)  //将 BigDecimal 的字符数组表示形式转换为 BigDecimal,接受与 BigDecimal(String) 构造方法相同的字符序列,并根据上下文设置进行舍入
  9. BigDecimal(char[] in, int offset, int len)  //将 BigDecimal 的字符数组表示形式转换为 BigDecimal,接受与 BigDecimal(String) 构造方法相同的字符序列,允许指定子数组(以offset为起始,长len)
  10. BigDecimal(char[] in, int offset, int len, MathContext mc)  //将 BigDecimal 的字符数组表示形式转换为 BigDecimal,允许指定子数组(以offset为起始,长len),并根据上下文设置进行舍入
  11. BigDecimal(int val)  //将 int 转换为 BigDecimal,其标度为0
  12. BigDecimal(int val, MathContext mc)  //将 int 转换为 BigDecimal,并根据上下文设置进行舍入,在进行任何舍入之前,BigDecimal的标度为零
  13. BigDecimal(long val)  //将 long 转换为 BigDecimal,其标度为0
  14. BigDecimal(long val, MathContext mc)  //将 long 转换为 BigDecimal,并根据上下文设置进行舍入,在进行任何舍入之前,BigDecimal的标度为零
  15. BigDecimal(double val)  //将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式(由于dounle无法精确表示浮点数,需要以double为参数构造BigDecimal时请先用toString()将double转为字符串,再用该字符串构造BigDecimal,下同)
  16. BigDecimal(double val, MathContext mc)  //将 double 转换为 BigDecimal,并根据上下文设置进行舍入(处理方式同上)。

四、常(suo)用(you)方法

算术运算(+ - * / % mod)

  1. BigDecimal add(BigDecimal augend)  //返回其值为 (this + augend) 的 BigDecimal,其标度为 max( this.scale() , augend.scale() )
  2. BigDecimal add(BigDecimal augend , MathContext mc)  //返回其值为 (this + augend) 的 BigDecimal,并根据上下文设置进行舍入
  3. BigDecimal subtract(BigDecimal subtrahend)  //返回其值为 (this - subtrahend) 的 BigDecimal,其标度为 max(this.scale(), subtrahend.scale())
  4. BigDecimal subtract(BigDecimal subtrahend , MathContext mc)  //返回其值为 (this - subtrahend) 的 BigDecimal,并根据上下文设置进行舍入
  5. BigDecimal multiply(BigDecimal multiplicand)  //返回其值为 (this × multiplicand) 的 BigDecimal,其标度为 ( this.scale() + multiplicand.scale() )
  6. BigDecimal multiply(BigDecimal multiplicand, MathContext mc)  //返回其值为 (this × multiplicand) 的 BigDecimal,并根据上下文设置进行舍入
  7. BigDecimal divide(BigDecimal divisor)  //返回其值为 (this / divisor) 的 BigDecimal,其首选标度为 (this.scale() - divisor.scale())。如果无法表示准确的商值(因为它有无穷的十进制扩展),则抛出 ArithmeticException
  8. BigDecimal divide(BigDecimal divisor, MathContext mc)  //返回其值为 (this / divisor) 的 BigDecimal,并根据上下文设置进行舍入
  9. BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode)  //返回其值为 (this / divisor) 的 BigDecimal,其标度为 this.scale() ,如果必须执行舍入以生成具有指定标度的结果,则应用指定的舍入模式
  10. BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)  //返回其值为 (this / divisor) 的 BigDecimal,其标度为指定标度
  11. BigDecimal divide(BigDecimal divisor, int roundingMode)  //(遗留的方法)返回其值为 (this / divisor) 的 BigDecimal,其标度为 this.scale()
  12. BigDecimal divide(BigDecimal divisor, int scale, int
    roundingMode)
      //(遗留的方法)返回其值为 (this / divisor) 的 BigDecimal,其标度为指定标度
  13. BigDecimal divideToIntegralValue(BigDecimal divisor)  //返回 BigDecimal,其值为向下舍入所得商值 (this / divisor) 的整数部分,其首选标度为 (this.scale() - divisor.scale())
  14. BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext
    mc)
      //返回 BigDecimal,其值为 (this / divisor) 的整数部分,其首选标度为 (this.scale() - divisor.scale())。(因为准确商值的整数部分与舍入模式无关,所以舍入模式不影响此方法返回的值)
  15. BigDecimal remainder(BigDecimal divisor)  //返回其值为 (this % divisor) 的 BigDecimal,余数由this.subtract(this.divideToIntegralValue(divisor).multiply(divisor))
    给出。注意,这不是模操作(结果可以为负)
  16. BigDecimal remainder(BigDecimal divisor, MathContext mc)  //返回其值为 (this % divisor) 的 BigDecimal(根据上下文设置进行舍入) 。MathContext 设置会影响用于计算余数的隐式除法。余数计算本身要进行准确的定义。因此,余数包含的数字个数可能多于
    mc.getPrecision()。在进行任何舍入之前,BigDecimal 的标度为零
  17. BigDecimal[] divideAndRemainder(BigDecimal divisor)  //返回由两个元素组成的 BigDecimal 数组,该数组包含 divideToIntegralValue 的结果,后跟对两个操作数计算所得到的 remainder
  18. BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc)  //返回由两个元素组成的 BigDecimal 数组,该数组包含 divideToIntegralValue 的结果,后跟对两个操作数计算所得到的 remainder

比较运算

  1. int compareTo(BigDecimal val)  //将此 BigDecimal 与指定的 BigDecimal 比较,使用方法:(a.compareTo(b) <op> 0) ,<op>为6个比较运算符之一(值相等但标度不同的两个BigDecimal被认为是相等的)
  2. boolean equals(Object x)  //比较此 BigDecimal 与指定的 Object 的相等性,当且仅当两个元素同为BigDecimal且二者值与标度都相同时才为真(2.0!=2.00)

数学运算

  1. BigDecimal abs()  //返回 BigDecimal,其值为此 BigDecimal 的绝对值,其标度为 this.scale()
  2. BigDecimal abs(MathContext mc)  //返回其值为此 BigDecimal 绝对值的 BigDecimal(根据上下文设置进行舍入)
  3. BigDecimal pow(int n)  //返回其值为 (thisn) 的 BigDecimal,准确计算该幂,使其具有无限精度
  4. BigDecimal pow(int n, MathContext mc)  //返回其值为 (thisn) 的 BigDecimal(根据上下文设置进行舍入)
  5. BigDecimal scaleByPowerOfTen(int n)  //返回其数值等于 (this * 10n) 的 BigDecimal,其标度为( this.scale() - n )
  6. BigDecimal max(BigDecimal val)  //返回此 BigDecimal 和 val 的最大值(相等返回this,下同)
  7. BigDecimal min(BigDecimal val)  //返回此 BigDecimal 和 val 的最小值
  8. int hashCode()  //返回此 BigDecimal 的哈希码(标度不同但值相同的两个数通常具有不同的哈希码)

与BigDecimal自身相关方法(由于BigDecimal不可变,所有方法均生成一个新BigDecimal而非改变原值)

  1. BigDecimal movePointLeft(int n)  //返回一个 BigDecimal,其值为 (this × 10-n),标度为 max(this.scale()+n, 0)。它等效于将该值的小数点向左移动 n 位,若n<0,该调用等效于movePointRight( abs(n) )
  2. BigDecimal movePointRight(int n)  //返回一个 BigDecimal,其值为 (this × 10n),标度为 max(this.scale()-n, 0)。它等效于将该值的小数点向右移动 n 位,若n<0,该调用等效于movePointLeft( abs(n) )
  3. BigDecimal negate()  //返回其值为 (-this) 的 BigDecimal,其标度为 this.scale()
  4. BigDecimal negate(MathContext mc)  //返回其值为 (-this) 的 BigDecimal(根据上下文设置进行舍入)
  5. BigDecimal plus()  //返回其值为 (+this) 的 BigDecimal,其标度为 this.scale()
  6. BigDecimal plus(MathContext mc)  //返回其值为 (+this) 的 BigDecimal(根据上下文设置进行舍入)
  7. BigDecimal round(MathContext mc)  //返回根据 MathContext 设置进行舍入后的 BigDecimal
  8. BigDecimal stripTrailingZeros()  //返回数值上等于此小数,但从该表示形式移除所有尾部零的 BigDecimal
  9. BigDecimal setScale(int newScale)  //返回一个 BigDecimal,其标度为指定值,其值在数值上等于此 BigDecimal 的值
  10. BigDecimal setScale(int newScale, int roundingMode)  //返回一个 BigDecimal,其标度为指定值,其非标度值通过此 BigDecimal 的非标度值乘以或除以十的适当次幂来确定,以维护其总值
  11. BigDecimal setScale(int newScale, RoundingMode roundingMode)  //返回 BigDecimal,其标度为指定值,其非标度值通过此 BigDecimal 的非标度值乘以或除以十的适当次幂来确定,以维护其总值
  12. int scale()  //返回此 BigDecimal 的标度
  13. int precision()  //返回此 BigDecimal 的精度
  14. int signum()  //返回此 BigDecimal 的正负号函数
  15. BigDecimal ulp()  //返回此 BigDecimal 的 ulp(最后一位的单位)的大小

BigDecimal与其他类型转换

  1. static BigDecimal valueOf(double val)  //使用 Double.toString(double) 方法提供的 double 规范的字符串表示形式将 double 转换为 BigDecimal
  2. static BigDecimal valueOf(long val)  //将 long 值转换为具有零标度的 BigDecimal
  3. static BigDecimal valueOf(long unscaledVal, int scale)  //将 long 非标度值和 int 标度转换为 BigDecimal
  4. byte byteValueExact()  //将此BigDecimal 转换为 byte,若BigDecimal含有小数部分或其值过大(超出byte),则抛出异常
  5. short shortValueExact()  //将此BigDecimal 转换为 short,若BigDecimal含有小数部分或其值过大(超出short),则抛出异常
  6. int intValue()  //将此BigDecimal 转换为 int,其行为类似于double想short的转换
  7. int intValueExact()  //将此BigDecimal 转换为 int,若BigDecimal含有小数部分或其值过大(超出int),则抛出异常
  8. long longValue()  //将此BigDecimal 转换为 long
  9. long longValueExact()  //将此BigDecimal 转换为 long,若BigDecimal含有小数部分或其值过大(超出long),则抛出异常
  10. BigInteger toBigInteger()  //将此BigDecimal 转换为 BigInteger
  11. BigInteger toBigIntegerExact()  //将此BigDecimal 转换为 BigInteger,若BigDecimal含有小数部分,则抛出异常
  12. BigInteger unscaledValue()  //返回其值为此BigDecimal 的非标度值的 BigInteger
  13. float floatValue()  //将此 BigDecimal 转换为 float,其行为类似于double向float的转换
  14. double doubleValue()  //将此 BigDecimal 转换为 double ,其行为类似于double向float的转换
  15. String toString()  //返回此 BigDecimal 的字符串表示形式,如果需要指数,则使用科学记数法
  16. String toEngineeringString()  //返回此 BigDecimal 的字符串表示形式,需要指数时,则使用工程计数法
  17. String toPlainString()  //返回不带指数字段的此 BigDecimal 的字符串表示形式

JAVA API:https://docs.oracle.com/javase/7/docs/api/

时间: 2024-10-10 09:45:55

BigDecimal类(高精度小数)的相关文章

java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定

一. 计算机的小数计算一定范围内精确,超过范围只能取近似值: 计算机存储的浮点数受存储bit位数影响,只能保证一定范围内精准,超过bit范围的只能取近似值. java中各类型的精度范围参见:http://blog.csdn.net/longshenlmj/article/details/47616481 编程时注意: doulbe类型的数,不能用等号判定是否相等(或者是一定范围内可以).因为两次同样的计算(除法)结果可能出现小数部分不同.甚至极端的时候,初始化两个小数时,都可能不相等(用数值和字

Java中的高精度整数和高精度小数

在实际编码中,会遇到很多高精度的事例,比如,在计算金钱的时候就需要保留高精度小数,这样计算才不会有太大误差: 在下面的代码中,我们验证了,当两个float型的数字相加,得到的结果和我们的预期结果是有误差的,为了减小和防止这种误差的出现,我们需要使用BigInteger类和BigDecimal类来计算. package com.ietree.base.number; import java.math.BigDecimal; import java.math.BigInteger; public c

java.math.BigDecimal类的用法

在java中提供了大数字的操作类,即java.math.BinInteger类和java.math.BigDecimal类.这两个类用于高精度计 算,其中BigInteger类是针对大整数的处理类,而BigDecimal类则是针对大小数的处理类.下边我们介绍BigDecimal类: BigDecimal的实现利用到了BigInteger,不同的是BigDecimal加入了小数的概念.一般的float型和Double型数据只可 以用来做科学计算或者是工程计算,由于在商业计算中,要求的数字精度比较高

Java BigDecimal类

1 package demo04; 2 3 import java.math.BigDecimal; 4 5 //double和float类型在运算中很容易丢失精度,造成数据的不准确性,BigDecimal类可以实现浮点数据的高精度运算 6 public class BigDecimalDemo { 7 public static void main(String[] args) { 8 BigDecimal b1 = new BigDecimal("0.09"); 9 BigDeci

用BigDecimal类实现Fibonacci算法

Fibonacci(N)=Fibonacii(N-1)+Fibonacci(N-2) 其中 Fibonacci(0)=0;Fibonacci(1)=1 用循环或则递归实现Fibonacci算法很简单,这里就不说了,如果要用公式实现的话,需要进行开根号和幂运算,普通的long型号只能精确到小数点之后的16位,这就意味着当N很大的时候由于小数位overflow无法进行精确运算,本人测试当N大于92时候因为数据溢出的原因就与实际结果不一样了,如果小数点后面不是精确16位,而是自己设定的话,那么运算结果

Java API —— BigDecimal类

1.BigDecimal类概述  由于在运算的时候,float类型和double很容易丢失精度,演示案例.所以,为了能精确的表示.计算浮点数,Java提供了BigDecimal 不可变的.任意精度的有符号十进制数. 2.构造方法 public BigDecimal(String val):建议使用参数为字符串的构造方法,如果参数为double或float,还是会出现不可预知的精度问题 3.BigDecimal类成员方法 public BigDecimal add(BigDecimal augen

BigIntager类和BigDecimal类

BigInteger类 BigInteger:可以让超过Integer范围内的数据进行运算 构造方法:      BigInteger(String val) 代码示例:BigInteger bi = new BigInteger("2147483648"); 成员方法: (1)public BigInteger add(BigInteger val):加     (2)public BigInteger subtract(BigInteger val):减     (3)public

Java基础系列9:BigInteger类和BigDecimal类

一 BigInteger类 当我们碰到需要处理一个很大的数字时,这时候肯定没法使用int和long.当然我们可以使用String来接收大数字,然后再采用拆分的方式来计算,不过这种方式很麻烦.因此在Java中为了解决这种问题,提供了BigInteger类.BigInteger类表示是大整数类,定义在java.math.*这个包中,如果操作的整数已经超过了整数的最大类型长度long,这时可以考虑使用BigInteger类来进行操作 常用方法的示例: package javase.base; impo

Java基础知识强化89:BigDecimal类之BigDecimal类引入和概述 以及 BigDecimal的使用(加减乘除)

1. BigDecimal类概述: 由于在运算的时候,float类型和double很容易丢失精度.所以为了能够精确的表达.计算浮点数,Java提供了BigDecimal. BigDecimal:不可变.任意精度的有符号十进制数. 2. BigDecimal构造方法 1 public BigDecimal(String val) 3. BigDecimal的使用(加减乘除) 1 public BigDecimal add(BigDecimal augend):加 2 public BigDecim