jdk源码学习Java.math包
阅读JDK源代码java.math中的
java.math.BigDecimal
java.math.BigInteger
java.math.BitSieve
java.math.MathContext
java.math.MutableBigInteger
java.math.RoundingMode
java.math.SignedMutableBigInteger
编写高质量代码 改善Java程序的151个建议 PDF高清完整版
Java对象序列化ObjectOutputStream和ObjectInputStream示例
1、java.math.BigDecimal
不可变的、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。
如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。因此,BigDecimal 表示的数值是unscaledValue × 10^(-scale)。
提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。
可以通过两种类型的操作来处理 BigDecimal 的标度:标度/舍入操作和小数点移动操作。标度/舍入操作(setScale 和 round)返回BigDecimal,其值近似地(或精确地)等于操作数的值,但是其标度或精度是指定的值;即:它们会增加或减少对其值具有最小影响的存储数的精度。小数点移动操作(movePointLeft 和 movePointRight)返回从操作数创建的 BigDecimal,创建的方法是按指定方向将小数点移动一个指定距离。
BigDecimal 的自然排序与 equals 方法不一致。
public class BigDecimal extends Number implementsComparable<BigDecimal>
属性:
private volatile BigInteger intVal //BigDecimal的非标度值
private int scale = 0 //BigDecimal的标度值
private volatile transient int precision = 0 //BigDecimal的精度.This field is mutable until set nonzero.
private volatile transient String stringCache = null //规范的字符表示
private static final long INFLATED = Long.MIN_VALUE //
private transient long intCompact = INFLATED
private static final int MAX_COMPACT_DIGITS = 18
private static final int MAX_BIGINT_BITS = 62
private static final long serialVersionUID = 6108874887143696463L
private static final BigDecimal zeroThroughTen[] 缓存0~10的数据
public static final BigDecimal ZERO = zeroThroughTen[0] 值为0,标度为 0。
public static final BigDecimal ONE = zeroThroughTen[1] 值为1,标度为 0。
public static final BigDecimal TEN = zeroThroughTen[10] 值为10,标度为 0。
public BigDecimal(char[] in, int offset, int len) //翻译字符数组为BigDecimal
public BigDecimal(char[] in, int offset, int len, MathContext mc) //调用this(in, offset, len);指定精度,if (mc.precision> 0) roundThis(mc)
public BigDecimal(char[] in) //调用this(in, 0, in.length)
public BigDecimal(char[] in, MathContext mc) //调用this(in,0, in.length, mc)
public BigDecimal(String val) //调用this(val.toCharArray(),0, val.length())
public BigDecimal(String val, MathContext mc) //this(val.toCharArray(), 0,val.length()); if (mc.precision > 0)roundThis(mc)
public BigDecimal(double val) //此构造方法的结果有一定的不可预知性,优先选用String参数
public BigDecimal(double val, MathContext mc) //调用this(val);if(mc.precision > 0) roundThis(mc)
public BigDecimal(BigInteger val) //将 BigInteger 转换为 BigDecimal。BigDecimal 的标度是零。
public BigDecimal(BigInteger val, MathContext mc) //将BigInteger 转换为 BigDecimal(根据上下文设置进行舍入)。BigDecimal 的标度为零。
public BigDecimal(BigInteger unscaledVal, int scale) //将 BigInteger 非标度值和 int 标度转换为 BigDecimal。BigDecimal 的值为 (unscaledVal × 10-scale)。
public BigDecimal(BigInteger unscaledVal, int scale, MathContext mc) //
public BigDecimal(int val) //将int转型成BigDecimal
public BigDecimal(int val, MathContext mc) //设置精度
public BigDecimal(long val) //将long转型成BigDecimal
public BigDecimal(long val, MathContext mc) //设置精度
private BigDecimal(long val, int scale) //Trusted internal constructor
private BigDecimal(BigInteger intVal, long val, int scale) //Trusted internalconstructor
public static BigDecimal valueOf(long unscaledVal, intscale) //将 long 非标度值和 int 标度转换为 BigDecimal。
public static BigDecimal valueOf(long val) //将 long 非标度值转换为 BigDecimal。
public static BigDecimal valueOf(double val) //将 double非标度值转换为 BigDecimal。
public BigDecimal add(BigDecimal augend) //加法
public BigDecimal add(BigDecimal augend, MathContext mc) //加法,带精度
private BigDecimal[] preAlign(BigDecimal lhs, BigDecimalaugend,long padding, MathContext mc)
public BigDecimal subtract(BigDecimal subtrahend) //减法
public BigDecimal subtract(BigDecimal subtrahend, MathContext mc) //减法,带精度
public BigDecimal multiply(BigDecimal multiplicand) //乘法
public BigDecimal multiply(BigDecimal multiplicand, MathContext mc) //乘法,带精度
public BigDecimal divide(BigDecimal divisor, int scale, introundingMode) //除法
public BigDecimal divide(BigDecimal divisor, int scale, RoundingModeroundingMode) //除法
public BigDecimal divide(BigDecimal divisor, int roundingMode) //舍入模式
public BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode) //舍入模式
public BigDecimal divide(BigDecimal divisor) //返回一个BigDecimal,其值为 (this / divisor),其首选标度为 (this.scale() – divisor.scale()
public BigDecimal divide(BigDecimal divisor, MathContext mc) //除法,带精度
public BigDecimal divideToIntegralValue(BigDecimal divisor)//返回整数型的除法值//返回 BigDecimal,其值为向下舍入所得商值 (this / divisor) 的整数部分。
public BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc) //带精度
public BigDecimal remainder(BigDecimal divisor) //返回剩余部分数据//数据的值为this.subtract(this.divideToIntegralValue(divisor).multiply(divisor))
public BigDecimal remainder(BigDecimal divisor, MathContext mc) //带精度
public BigDecimal[] divideAndRemainder(BigDecimaldivisor)//除并且返回剩余值
public BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc) //带精度
public BigDecimal pow(int n) //N次方
public BigDecimal pow(int n, MathContext mc) //带精度
public BigDecimal abs() //绝对值
public BigDecimal abs(MathContext mc) //带精度
public BigDecimal negate() //取负
public BigDecimal negate(MathContext mc)
public BigDecimal plus() //与negate()对称
public BigDecimal plus(MathContext mc) //带精度
public int signum() //正负号函数
public int scale() //返回数的标度
public int precision() //返回数的精度
public BigInteger unscaledValue() //返回其值为此 BigDecimal 的非标度值的 BigInteger。(计算 (this *10this.scale())。)
数值的舍入方式
public final static int ROUND_UP= 0
public final static int ROUND_DOWN= 1
public final static int ROUND_CEILING = 2
public final static int ROUND_FLOOR = 3
public final static int ROUND_HALF_UP = 4
public final static int ROUND_HALF_DOWN = 5
public final static int ROUND_HALF_EVEN = 6
public final static int ROUND_UNNECESSARY = 7
public BigDecimal round(MathContext mc) //对数值进行舍入
public BigDecimal setScale(int newScale, RoundingMode roundingMode) //设置新的标度
public BigDecimal setScale(int newScale, int roundingMode) //设置新的标度
public BigDecimal setScale(int newScale) //调用setScale(newScale,ROUND_UNNECESSARY)
public BigDecimal movePointLeft(int n) //小数点左移
public BigDecimal movePointRight(int n) //小数点右移
public BigDecimal scaleByPowerOfTen(int n) //返回其数值等于(this * 10n) 的 BigDecimal。该结果的标度为 (this.scale() – n)。
public BigDecimal stripTrailingZeros() //去除尾部多余的零
public int compareTo(BigDecimal val) //比较数值的大小
public boolean equals(Object x) //判断是否相等
public BigDecimal min(BigDecimal val) //返回较小值
public BigDecimal max(BigDecimal val) //返回较大值
public int hashCode() //hashCode
public String toString() //返回字符串表示形式
public String toEngineeringString() //科学计数法
public String toPlainString() //不带指数的表示
private String getValueString(int signum, String intString, int scale) //返回digit.digit字符串的形式
public BigInteger toBigInteger()
public BigInteger toBigIntegerExact()
public long longValue()
public long longValueExact()
// These constants are only initialized if needed
/** BigInteger equal to Long.MIN_VALUE. */
private static BigInteger LONGMIN = null;
/** BigInteger equal to Long.MAX_VALUE. */
private static BigInteger LONGMAX = null;
public int intValue()
public int intValueExact()
public short shortValueExact()
public byte byteValueExact()
public float floatValue()
public double doubleValue()
public BigDecimal ulp()
private String layoutChars(boolean sci)
private static BigInteger tenToThe(int n)
private static BigInteger TENPOWERS[]
private static long longTenToThe(long val, int n)
private static long thresholds[][]
private static boolean compactLong(long val) //返回(val!= Long.MIN_VALUE)
private BigDecimal inflate()
private static void matchScale(BigDecimal[] val)
private synchronized voidreadObject(java.io.ObjectInputStream s)
private void writeObject(java.io.ObjectOutputStream s)
private int digitLength()
private static int[] ilogTable
private int intLength(int x)
private BigDecimal stripZerosToMatchScale(long preferredScale)
private int checkScale(long val)
private BigDecimal roundOp(MathContext mc)
private void roundThis(MathContext mc)
private BigDecimal doRound(MathContext mc)
private BigDecimal dropDigits(MathContext mc, int drop)
private static int longCompareTo(long x, long y)
private static void print(String name, BigDecimal bd) //内部打印格式
private BigDecimal audit() //审计