位置: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/

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

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

    一. 计算机的小数计算一定范围内精确,超过范围只能取近似值: 计算机存储的浮点数受存储bit位数影响,只能保证一定范围内精准,超过bit范围的只能取近似值. java中各类型的精度范围参见:http: ...

  2. 【Java】使用BigDecimal类进行精确小数计算

    在商业计算中(尤其是计算价格)需要使用BigDecimal类来进行精确小数计算,因为用其他类型计算(如double)得到的结果不是精确的! 写个测试类. import org.junit.Test; ...

  3. 高精度小数BigDecimal+二分——java

    高精度小数第一题 import java.util.*; import java.math.*; public class Main { public static void main(String ...

  4. BIgInteger类和BigDecimal类的理解

    第一部分: 这两个类位于java.math包内,要使用它们必须在类前面引用该包:import java.math.BigInteger;和import java.math.BigDecimal; Bi ...

  5. java基础-BigDecimal类常用方法介绍

    java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...

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

    在实际编码中,会遇到很多高精度的事例,比如,在计算金钱的时候就需要保留高精度小数,这样计算才不会有太大误差: 在下面的代码中,我们验证了,当两个float型的数字相加,得到的结果和我们的预期结果是有误 ...

  7. Java API —— BigDecimal类

    1.BigDecimal类概述  由于在运算的时候,float类型和double很容易丢失精度,演示案例.所以,为了能精确的表示.计算浮点数,Java提供了BigDecimal 不可变的.任意精度的有 ...

  8. 用BigDecimal类实现Fibonacci算法

    Fibonacci(N)=Fibonacii(N-1)+Fibonacci(N-2) 其中 Fibonacci(0)=0;Fibonacci(1)=1 用循环或则递归实现Fibonacci算法很简单, ...

  9. java.math.BigDecimal类

    BigDecimal类用于高精度计算.一般的float型和Double型数据只可以用来做科学计算或者是工程计算,由于在商业计算中,要求的数字精度比较高,所以要用到java.math.BigDecima ...

随机推荐

  1. 301 和 302 对 SEO 的影响

    网站优化中,经常会面临网站链接修改或改变的事情,其中一个解决办法就是使用网站跳转的方式,处理变化的链接,下面讲述301和302跳转对SEO的影响. 301(永久移动) 请求的网页已被永久移动到新位置. ...

  2. Flex布局 Flexbox属性具体解释

    原文:A Visual Guide to CSS3 Flexbox Properties Flex布局官方称为CSS Flexble Box布局模型是CSS3为了提高元素在容器中的对齐.方向.顺序,甚 ...

  3. C 中 main 函数的參数

          看到不同的人写出的 C 或者 C++ 程序时,可能会出现不一样的 main 函数的定义,以下的几种定义方式都是对的: int main(void) int main(int argc) i ...

  4. JFinal Starting scanner at interval of 5 seconds.报错

    Starting JFinal 2.0 Starting scanner at interval of 5 seconds. Starting web server on port: 80 Excep ...

  5. tensorflow利用预训练模型进行目标检测(四):检测中的精度问题以及evaluation

    一.tensorflow提供的evaluation Inference and evaluation on the Open Images dataset:https://github.com/ten ...

  6. linux下的oom调试笔记【原创】

    平台信息:内核:linux3.0.68 系统:android/android5.1平台:s5p4418 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 摘要:调整and ...

  7. xocde8打印出:Presenting view controllers on detached view controllers is discouraged

    原因: 是某个viewController的生命周期控制出现了错误,所以尽量避免一个controller的view去addsubview另一个controller的view,这样会破坏层级关系,导致第 ...

  8. [NOIP 2007] 树网的核

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1999 [算法] 树的直径 + 单调队列 [代码] #include<bits/ ...

  9. linux git保存用户名密码(避免每次push输用户名密码)

    Linux/Unix/Mac 系统 新建一个 ~/.netrc 文件, 将 git 服务器, 用户名以及密码记录在这个文件, 如下所示:   machine your-git-server   log ...

  10. Python中断言与异常的区别

    异常,在程序运行时出现非正常情况时会被抛出,比如常见的名称错误.键错误等. 异常: >>> s Traceback (most recent call last): File &qu ...