`
yangzb
  • 浏览: 3500757 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java.math 类 BigDecimal

    博客分类:
  • Java
阅读更多

java.math
类 BigDecimal

java.lang.Object

  继承者 
java.lang.Number

      继承者 
java.math.BigDecimal

所有已实现的接口:
Serializable , Comparable <BigDecimal >

public class BigDecimal
extends Number
implements Comparable <BigDecimal >

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

BigDecimal 类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。toString() 方法提供 BigDecimal 的规范表示形式。

BigDecimal 类使用户能完全控制舍入行为。如果未指定舍入模式,并且无法表示准确结果,则抛出一个异常;否则,通过向该操作提供适当的 MathContext 对象,可以对已选择的精度和舍入模式执行计算。在任何情况下,可以为舍入控制提供八种舍入模式 。使用此类(例如,ROUND_HALF_UP )中的整数字段来表示舍入模式已过时;应改为使用 RoundingMode enum (例如,RoundingMode.HALF_UP )的枚举值。

当为 MathContext 对象提供 0 的精度设置(例如,MathContext.UNLIMITED )时,算术运算是准确的,它们是不采用任何 MathContext 对象的算术方法。(这是第 5 版之前的版本支持的惟一行为。)为了计算准确结果,不使用附带 0 精度设置的 MathContext 对象的舍入模式设置,因此与该对象无关。在除法中,准确的商可能是一个无限长的十进制扩展;例如,1 除以 3 所得的商。如果商具有无穷的十进制扩展,但是指定了该操作返回准确结果,则抛出 ArithmeticException 。否则,像其他操作那样,返回除法运算的准确结果。

当精度设置不为 0 时,BigDecimal 算法的规则完全符合 ANSI X3.274-1996 和 ANSI X3.274-1996/AM 1-2000( 7.4 节)中定义的算法的可选操作模式。与上述标准不同,BigDecimal 包括多种舍入模式,它们对于版本 5 以前的 BigDecimal 版本中的除法是强制性的。这些 ANSI 标准和 BigDecimal 规范之间的任何冲突都按照有利于 BigDecimal 的方式进行解决。

由于同一数值可以有不同的表示形式(具有不同的标度),因此运算和舍入的规则必须同时指定数值结果和结果表示形式中所用的标度。

一般情况下,当准确结果(在除法中,可能有无限多位)比返回的数值具有更多位数时,舍入模式和精度设置确定操作如何返回具有有限位数的结果。 首先,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()

这些标度是返回准确算术结果的方法使用的标度;准确相除可能必须使用较大的标度除外,因为准确的结果可能有较多的位数。例如,1/32 得到 0.03125

舍入之前,逻辑的准确中间结果的标度是该运算的首选标度。如果用 precision 位数无法表示准确的数值结果,则舍入会选择要返回的一组数字,并将该结果的标度从中间结果的标度减小到可以表示实际返回的 precision 位数的最小标度。如果准确结果可以使用最多 precision 个数字表示,则返回具有最接近首选标度的标度的结果表示形式。尤其是,通过移除结尾零并减少标度,可以用少于 precision 个数字来表示准确的可表示的商。例如,使用 floor 舍入模式将结果舍入为三个数字,
19/100 = 0.19 // integer=19, scale=2
但是
21/110 = 0.190 // integer=190, scale=3

注意,对于加、减和乘,标度的缩减量将等于丢弃的准确结果的数字位置数。如果舍入导致进位传播创建一个新的高位,则当未创建新的数位时,会丢弃该结果的附加数字。

其他方法可能与舍入语义稍微不同。例如,使用指定的算法pow 方法得到的结果可能偶尔不同于舍入得到的算术结果,如最后一位有多个单位(ulp )。

可以通过两种类型的操作来处理 BigDecimal 的标度:标度/舍入操作和小数点移动操作。标度/舍入操作(setScale round )返回 BigDecimal ,其值近似地(或精确地)等于操作数的值,但是其标度或精度是指定的值;即:它们会增加或减少对其值具有最小影响的存储数的精度。小数点移动操作(movePointLeft movePointRight )返回从操作数创建的 BigDecimal ,创建的方法是按指定方向将小数点移动一个指定距离。

为了简洁明了起见,整个 BigDecimal 方法的描述中都使用了伪代码。伪代码表达式 (i + j) 是“其值为 BigDecimal iBigDecimal jBigDecimal ”的简写。伪代码表达式 (i == j) 是“当且仅当 BigDecimal i 表示与 BigDecimal j 相同的值时,则为 true ”的简写。可以类似地解释其他伪代码表达式。方括号用于表示特定的 BigInteger 和定义 BigDecimal 值的标度对;例如,[19, 2] 表示 BigDecimal 在数值上等于 0.19,标度是 2。

注:如果 BigDecimal 对象用作 SortedMap 中的键或 SortedSet 中的元素,则应特别小心,因为 BigDecimal自然排序 与 equals 方法不一致 。有关更多信息,请参见 Comparable SortedMap SortedSet

当为任何输入参数传递 null 对象引用时,此类的所有方法和构造方法都将抛出 NullPointerException

 

 

另请参见:
BigInteger , MathContext , RoundingMode , SortedMap , SortedSet , 序列化表格

<!----> <!---->

字段摘要
static BigDecimal ONE
          值为 1,标度为 0。
static int ROUND_CEILING
          接近正无穷大的舍入模式。
static int ROUND_DOWN
          接近零的舍入模式。
static int ROUND_FLOOR
          接近负无穷大的舍入模式。
static int ROUND_HALF_DOWN
          向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
static int ROUND_HALF_EVEN
          向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
static int ROUND_HALF_UP
          向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
static int ROUND_UNNECESSARY
          断言请求的操作具有精确的结果,因此不需要舍入。
static int ROUND_UP
          舍入远离零的舍入模式。
static BigDecimal TEN
          值为 10,标度为 0。
static BigDecimal ZERO
          值为 0,标度为 0。
 

<!---->

构造方法摘要
BigDecimal (BigInteger  val)
          将 BigInteger 转换为 BigDecimal
BigDecimal (BigInteger  unscaledVal, int scale)
          将 BigInteger 非标度值和 int 标度转换为 BigDecimal
BigDecimal (BigInteger  unscaledVal, int scale, MathContext  mc)
          将 BigInteger 非标度值和 int 标度转换为 BigDecimal (根据上下文设置进行舍入)。
BigDecimal (BigInteger  val, MathContext  mc)
          将 BigInteger 转换为 BigDecimal (根据上下文设置进行舍入)。
BigDecimal (char[] in)
          将 BigDecimal 的字符数组表示形式转换为 BigDecimal ,接受与 BigDecimal(String) 构造方法相同的字符序列。
BigDecimal (char[] in, int offset, int len)
          将 BigDecimal 的字符数组表示形式转换为 BigDecimal ,接受与 BigDecimal(String) 构造方法相同的字符序列,同时允许指定子数组。
BigDecimal (char[] in, int offset, int len, MathContext  mc)
          将 BigDecimal 的字符数组表示形式转换为 BigDecimal ,接受与 BigDecimal(String) 构造方法相同的字符序列,同时允许指定子数组,并根据上下文设置进行舍入。
BigDecimal (char[] in, MathContext  mc)
          将 BigDecimal 的字符数组表示形式转换为 BigDecimal ,接受与 BigDecimal(String) 构造方法相同的字符序列(根据上下文设置进行舍入)。
BigDecimal (double val)
          将 double 转换为 BigDecimal ,后者是 double 的二进制浮点值准确的十进制表示形式。
BigDecimal (double val, MathContext  mc)
          将 double 转换为 BigDecimal (根据上下文设置进行舍入)。
BigDecimal (int val)
          将 int 转换为 BigDecimal
BigDecimal (int val, MathContext  mc)
          将 int 转换为 BigDecimal (根据上下文设置进行舍入)。
BigDecimal (long val)
          将 long 转换为 BigDecimal
BigDecimal (long val, MathContext  mc)
          将 long 转换为 BigDecimal (根据上下文设置进行舍入)。
BigDecimal (String  val)
          将 BigDecimal 的字符串表示形式转换为 BigDecimal
BigDecimal (String  val, MathContext  mc)
          将 BigDecimal 的字符串表示形式转换为 BigDecimal ,接受与 BigDecimal(String) 构造方法相同的字符串(按照上下文设置进行舍入)。
 

<!---->

方法摘要
 BigDecimal abs ()
          返回 BigDecimal ,其值为此 BigDecimal 的绝对值,其标度为 this.scale()
 BigDecimal abs (MathContext  mc)
          返回其值为此 BigDecimal 绝对值的 BigDecimal (根据上下文设置进行舍入)。
 BigDecimal add (BigDecimal  augend)
          返回一个 BigDecimal ,其值为 (this + augend) ,其标度为 max(this.scale(), augend.scale())
 BigDecimal add (BigDecimal  augend, MathContext  mc)
          返回其值为 (this + augend)BigDecimal (根据上下文设置进行舍入)。
 byte byteValueExact ()
          将此 BigDecimal 转换为 byte ,以检查丢失的信息。
 int compareTo (BigDecimal  val)
          将此 BigDecimal 与指定的 BigDecimal 比较。
 BigDecimal divide (BigDecimal  divisor)
          返回一个 BigDecimal ,其值为 (this / divisor) ,其首选标度为 (this.scale() - divisor.scale()) ;如果无法表示准确的商值(因为它有无穷的十进制扩展),则抛出 ArithmeticException
 BigDecimal divide (BigDecimal  divisor, int roundingMode)
          返回一个 BigDecimal ,其值为 (this / divisor) ,其标度为 this.scale()
 BigDecimal divide (BigDecimal  divisor, int scale, int roundingMode)
          返回一个 BigDecimal ,其值为 (this / divisor) ,其标度为指定标度。
 BigDecimal divide (BigDecimal  divisor, int scale, RoundingMode  roundingMode)
          返回一个 BigDecimal ,其值为 (this / divisor) ,其标度为指定标度。
 BigDecimal divide (BigDecimal  divisor, MathContext  mc)
          返回其值为 (this / divisor)BigDecimal (根据上下文设置进行舍入)。
 BigDecimal divide (BigDecimal  divisor, RoundingMode  roundingMode)
          返回一个 BigDecimal ,其值为 (this / divisor) ,其标度为 this.scale()
 BigDecimal [] divideAndRemainder (BigDecimal  divisor)
          返回由两个元素组成的 BigDecimal 数组,该数组包含 divideToIntegralValue 的结果,后跟对两个操作数计算所得到的 remainder
 BigDecimal [] divideAndRemainder (BigDecimal  divisor, MathContext  mc)
          返回由两个元素组成的 BigDecimal 数组,该数组包含 divideToIntegralValue 的结果,后跟根据上下文设置对两个操作数进行舍入计算所得到的 remainder 的结果。
 BigDecimal divideToIntegralValue (BigDecimal  divisor)
          返回 BigDecimal ,其值为向下舍入所得商值 (this / divisor) 的整数部分。
 BigDecimal divideToIntegralValue (BigDecimal  divisor, MathContext  mc)
          返回 BigDecimal ,其值为 (this / divisor) 的整数部分。
 double doubleValue ()
          将此 BigDecimal 转换为 double
 boolean equals (Object  x)
          比较此 BigDecimal 与指定的 Object 的相等性。
 float floatValue ()
          将此 BigDecimal 转换为 float
 int hashCode ()
          返回此 BigDecimal 的哈希码。
 int intValue ()
          将此 BigDecimal 转换为 int
 int intValueExact ()
          将此 BigDecimal 转换为 int ,以检查丢失的信息。
 long longValue ()
          将此 BigDecimal 转换为 long
 long longValueExact ()
          将此 BigDecimal 转换为 long ,以检查丢失的信息。
 BigDecimal max (BigDecimal  val)
          返回此 BigDecimalval 的最大值。
 BigDecimal min (BigDecimal  val)
          返回此 BigDecimalval 的最小值。
 BigDecimal movePointLeft (int n)
          返回一个 BigDecimal ,它等效于将该值的小数点向左移动 n 位。
 BigDecimal movePointRight (int n)
          返回一个 BigDecimal ,它等效于将该值的小数点向右移动 n 位。
 BigDecimal multiply (BigDecimal  multiplicand)
          返回一个 BigDecimal ,其值为 (this × multiplicand) ,其标度为 (this.scale() + multiplicand.scale())
 BigDecimal multiply (BigDecimal  multiplicand, MathContext  mc)
          返回其值为 (this × multiplicand)BigDecimal (根据上下文设置进行舍入)。
 BigDecimal negate ()
          返回 BigDecimal ,其值为 (-this) ,其标度为 this.scale()
 BigDecimal negate (MathContext  mc)
          返回其值为 (-this)BigDecimal (根据上下文设置进行舍入)。
 BigDecimal plus ()
          返回 BigDecimal ,其值为 (+this) ,其标度为 this.scale()
 BigDecimal plus (MathContext  mc)
          返回其值为 (+this)BigDecimal (根据上下文设置进行舍入)。
 BigDecimal pow (int n)
          返回其值为 (thisn )BigDecimal ,准确计算该幂,使其具有无限精度。
 BigDecimal pow (int n, MathContext  mc)
          返回其值为 (thisn )BigDecimal
 int precision ()
          返回此 BigDecimal精度
 BigDecimal remainder (BigDecimal  divisor)
          返回其值为 (this % divisor)BigDecimal
 BigDecimal remainder (BigDecimal  divisor, MathContext  mc)
          返回其值为 (this % divisor)BigDecimal (根据上下文设置进行舍入)。
 BigDecimal round (MathContext  mc)
          返回根据 MathContext 设置进行舍入后的 BigDecimal
 int scale ()
          返回此 BigDecimal标度
 BigDecimal scaleByPowerOfTen (int n)
          返回其数值等于 (this * 10n ) 的 BigDecimal。
 BigDecimal setScale (int newScale)
          返回一个 BigDecimal ,其标度为指定值,其值在数值上等于此 BigDecimal 的值。
 BigDecimal setScale (int newScale, int roundingMode)
          返回一个 BigDecimal ,其标度为指定值,其非标度值通过此 BigDecimal 的非标度值乘以或除以十的适当次幂来确定,以维护其总值。
 BigDecimal setScale (int newScale, RoundingMode  roundingMode)
          返回 BigDecimal ,其标度为指定值,其非标度值通过此 BigDecimal 的非标度值乘以或除以十的适当次幂来确定,以维护其总值。
 short shortValueExact ()
          将此 BigDecimal 转换为 short ,以检查丢失的信息。
 int signum ()
          返回此 BigDecimal 的正负号函数。
 BigDecimal stripTrailingZeros ()
          返回数值上等于此小数,但从该表示形式移除所有尾部零的 BigDecimal
 BigDecimal
分享到:
评论

相关推荐

    java.math.BigDecimal 操作类

    java.math.BigDecimal 操作类,包含加减乘除、String型加减乘除精度格式化转换计算等

    Can't find a codec for class java.math.BigDecimal.txt

    解决mongo数据插入时 报错问题 mogodb插入数据时报错Can't find a codec for class java.math.BigDecimal

    BigDecimal 加减乘除运算

    Java中BigInteger的数学运算,BigDecimal 加减乘除运算,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大...

    关于java中BigDecimal的简介(csdn)————程序.pdf

    Java中的`BigDecimal`类是用于表示和操作高精度浮点数的重要工具,尤其适用于需要进行精确计算的场景,如财务和货币计算。由于基本数据类型`double`和`float`在进行大数值或高精度计算时可能会导致精度丢失,因此`...

    A Class for Creating a Trace Log(153KB)

    标题"A Class for Creating a Trace Log"指出,这是一个关于创建跟踪日志的类的教程或代码示例。在软件开发中,跟踪日志是用于记录程序运行时信息的重要工具,它帮助开发者诊断错误、调试代码以及优化性能。这个类...

    java实现大数加法(BigDecimal)的实例代码

    在Java编程语言中,处理大数(大数据量的整数)加法时,通常会使用`java.math.BigDecimal`类。这个类提供了精确的浮点数运算,特别适合于需要高精度计算的情况,如金融计算或者复杂的数学运算。下面将详细讨论`...

    java中math类的使用

    在Java编程语言中,`java.lang.Math`类提供了一系列用于执行基本数学运算的方法和常量。这个类包含静态方法和常量,使得开发者无需实例化对象即可直接调用其功能,极大地简化了数学计算的过程。 ### 常量 #### ...

    BigDecimalUtils

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做...

    java.math包下计算浮点数和整数的类的实例

    Java.math 包下计算浮点数和整数...Java.math 包下计算浮点数和整数的类的实例非常重要, BigInteger 和 BigDecimal 两个类是 Java.math 包中的核心类,它们提供了高精度的整数和浮点数运算,用于解决复杂的数学问题。

    计算器代吗

    import java.math.BigDecimal; import java.util.regex.Pattern; import com.android.xiong.gridlayoutTest.R.id; import android.os.Bundle; import android.app.Activity; import android.view.Menu; ...

    Java对BigDecimal常用方法的归类 -计算机等级考试-考试吧

    JAVA基础:java.math.BigDecimal的使用方法. JAVA基础:java.math.BigDecimal的使用方法.

    java中数学操作类的简介共5页.pdf.zip

    除了这些基本的数学操作,Java还提供了其他类来处理复数(`java.math.Complex`),大数(`java.math.BigInteger`和`java.math.BigDecimal`)以及高精度浮点数(`java.math.BigDecimal`)。这些类在需要更高精度或更...

    oracle数据类型和对应的JDBC类型.pdf

    NUMBER(p, s)对应的 JDBC 类型是 java.sql.Types.DECIMAL,Java 类型也是 java.math.BigDecimal。 3. 日期和时间类型 DATE 对应的 JDBC 类型是 java.sql.Types.DATE,Java 类型是 java.sql.Date。TIMESTAMP ...

    Java Double相加出现的怪事

    在《Effective Java》这本书中也提到这个原则,float 和 double 只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。BigDecimal 一共有 4 个够造方法,我们可以使用 BigDecimal(double ...

    API规范JAVA.pdf

    * java.math 是 Java 2 Platform 的一部分,提供了用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 21、网络应用程序:java.net 为实现网络应用程序提供类。 * java.net 是 Java 2...

    java-BigInteger-BigDecimal类源码

    通过阅读`BigInteger.java`和`BigDecimal.java`的源代码,我们可以深入了解这两个类的实现细节,包括它们如何存储和操作数值,以及各种算法的实现。源代码分析可以帮助我们理解内部工作原理,提高性能优化的能力,...

    js_bigdecimal_1_0_1.zip

    在Java中,有内置的`java.math.BigDecimal`类,但JavaScript原生并不支持这样的数据类型。因此,"js_bigdecimal_1_0_1"库可能是将Java的BigDecimal概念移植到了JavaScript中,以便在Web开发中进行高精度计算。 这个...

    sqlserver数据库类型对应Java中的数据类型

    在 Java 中,decimal 对应的数据类型是 java.math.BigDecimal。 float 在 SQL Server 中,float 是一个浮点数类型,用于存储浮点数值。在 Java 中,float 对应的数据类型是 double。 int 在 SQL Server 中,int ...

Global site tag (gtag.js) - Google Analytics