BigInteger和BigDecimal提供的操作与对基本类型所能执行的操作相似,只不过是以方法调用方式取代运算符方式来实现。等于是用速度换取了精度
BigInteger支持任意精度的整数,在运算中可以准确地表示任何大小的整数值,而不会丢失任何信息。BigDecimal支持任何精度的定点数,可以用它进行精确的货币计算
它们都扩展Number类且实现Comparable接口,可以使用new BigInteger(String)或new BigDecimal(String)来创建实例,使用add(加),subtract(减),multiply(乘),divide(除)和remainder(余)方法完成算数运算,使用compareTo方法比较两个大数字
常用的声明
public static void main(String[] args) {
BigInteger a = new BigInteger("123");
BigInteger b = BigInteger.valueOf(123);
BigDecimal c = new BigDecimal("123.123");
BigDecimal d = BigDecimal.valueOf(123.123);
}
示例
public static void main(String[] args) {
BigInteger a = new BigInteger("123");
BigInteger b = BigInteger.valueOf(123);
BigDecimal c = new BigDecimal("123.123");
BigDecimal d = BigDecimal.valueOf(123.123);
BigInteger x = a.add(b);// 加
BigDecimal p = c.subtract(d);// 减
BigInteger y = a.multiply(b);// 乘
BigInteger u = a.divide(b);//除
BigInteger i = a.remainder(b);//余
int h = a.intValue();//转int
double e = c.doubleValue();//转double
}
注意:
BigDecimal divide(String val) 除,因为它有无穷的十进制扩展,如果除不尽则抛出抛出 ArithmeticException异常完整错误如下:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
BigDecimal(double val)构造,用double当参数来构造一个BigDecimal对象。
但是这个构造不太靠谱(unpredictable),你可能以为BigDecimal(0.1)就是妥妥的等于0.1,但是你以为你以为的就是你以为的?还真不是,BigDecimal(0.1)这货实际上等于0.1000000000000000055511151231257827021171583404541015625,因为准确的来说0.1本身不能算是一个double(其实0.1不能代表任何一个定长二进制分数)。
BigDecimal(String val)构造是靠谱的,BigDecimal(“0.1”)就是妥妥的等于0.1,推荐大家用这个构造。
如果你非得用一个double变量来构造一个BigDecimal,没问题,我们贴心的提供了静态方法valueOf(double),这个方法跟new Decimal(Double.toString(double))效果是一样的。
RoundingMode
-
指定能够丢弃精度的数值运算的舍入行为 。 每个舍入模式指示如何计算舍入结果的最低有效返回数字。 如果返回的数字少于表示确切数值结果所需的数字,则丢弃的数字将被称为丢弃的分数 ,而不管数字对数字值的贡献。 换句话说,被考虑为数值,被丢弃的分数可以具有大于1的绝对值。
RoundingMode.UP:远离零方向舍入的舍入模式
RoundingMode.DOWN:去掉小数部分取整,也就是正数取左边,负数取右边,相当于向原点靠近的方向取整
RoundingMode.CEILING:取右边最近的整数
RoundingMode.FLOOR:取左边最近的正数
RoundingMode.HALF_UP:四舍五入,负数原理同上
RoundingMode.HALF_DOWN:五舍六入,负数先取绝对值再五舍六入再负数
RoundingMode.HALF_EVEN:整数位若是奇数则四舍五入,若是偶数则五舍六入
RoundingMode.UNNECESSARY:用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入
案例
public static void main(String[] args) {
BigDecimal a = new BigDecimal("10");
BigDecimal b = BigDecimal.valueOf(3);
System.out.println(a.divide(b, 2,RoundingMode.HALF_UP));//结果:3.33
}
BigInteger和BigDecimal相应JDK
父类
- java.lang.Object
-
- java.lang.Number
-
- java.math.BigInteger
- java.math.BigDecimal
实现类
-
implements Comparable<BigInteger>, Serializable
BigInteger(byte[] val) 将包含BigInteger的二进制补码二进制表达式的字节数组转换为BigInteger。 |
BigInteger(int signum, byte[] magnitude) 将BigInteger的符号大小表示形式转换为BigInteger。 |
BigInteger(int bitLength, int certainty, Random rnd) 构造一个随机生成的正BigInteger,它可能是素数,具有指定的bitLength。 |
BigInteger(int numBits, Random rnd) 构造一个随机生成的BigInteger,均匀分布在0到(2 |
BigInteger(String val) 将BigInteger的十进制字符串表示形式转换为BigInteger。 |
BigInteger(String val, int radix) 将指定基数中的BigInteger的String表示形式转换为BigInteger。 |
BigDecimal(BigInteger val) 将 |
BigDecimal(BigInteger unscaledVal, int scale) 将BigInteger的 |
BigDecimal(BigInteger unscaledVal, int scale, MathContext mc) 将 |
BigDecimal(BigInteger val, MathContext mc) 根据上下文设置将 |
BigDecimal(char[] in) 一个转换的字符数组表示 |
BigDecimal(char[] in, int offset, int len) 一个转换的字符数组表示 |
BigDecimal(char[] in, int offset, int len, MathContext mc) 一个转换的字符数组表示 |
BigDecimal(char[] in, MathContext mc) 一个转换的字符数组表示 |
BigDecimal(double val) 将 |
BigDecimal(double val, MathContext mc) 将 |
BigDecimal(int val) 将 |
BigDecimal(int val, MathContext mc) 将 |
BigDecimal(long val) 将 |
BigDecimal(long val, MathContext mc) 将 |
BigDecimal(String val) 将BigDecimal的字符串表示 |
BigDecimal(String val, MathContext mc) 一个转换的字符串表示 |
BigInteger | abs() 返回一个BigInteger,它的值是此BigInteger的绝对值。 |
BigInteger | add(BigInteger val) 返回值为 |
BigInteger | and(BigInteger val) 返回值为 |
BigInteger | andNot(BigInteger val) 返回值为 |
int | bitCount() 返回与其符号位不同的BigInteger的二进制补码表示中的位数。 |
int | bitLength() 返回此BigInteger的最小二进制补码表示中的位数, 不包括符号位。 |
byte | byteValueExact() 将此 |
BigInteger | clearBit(int n) 返回一个BigInteger,其值等于此BigInteger,指定的位被清零。 |
int | compareTo(BigInteger val) 将此BigInteger与指定的BigInteger进行比较。 |
BigInteger | divide(BigInteger val) 返回值为 |
BigInteger[] | divideAndRemainder(BigInteger val) 返回两个BigInteger的数组,其中包含 |
double | doubleValue() 将此BigInteger转换为 |
boolean | equals(Object x) 将此BigInteger与指定的对象进行比较以实现相等。 |
BigInteger | flipBit(int n) 返回一个BigInteger,其值等于此BigInteger,指定的位被翻转。 |
float | floatValue() 将此BigInteger转换为 |
BigInteger | gcd(BigInteger val) 返回一个BigInteger,其值是 |
int | getLowestSetBit() 返回此BigInteger中最右(最低位)一位的索引(最右边一位右侧的零位数)。 |
int | hashCode() 返回此BigInteger的哈希码。 |
int | intValue() 将此BigInteger转换为 |
int | intValueExact() 将此 |
boolean | isProbablePrime(int certainty) 返回 |
long | longValue() 将此BigInteger转换为 |
long | longValueExact() 将此 |
BigInteger | max(BigInteger val) 返回此BigInteger和 |
BigInteger | min(BigInteger val) 返回此BigInteger和 |
BigInteger | mod(BigInteger m) 返回值为 |
BigInteger | modInverse(BigInteger m) 返回值为 |
BigInteger | modPow(BigInteger exponent, BigInteger m) 返回值为 (thisexponent mod m)的BigInteger 。 |
BigInteger | multiply(BigInteger val) 返回值为 |
BigInteger | negate() 返回值为 |
BigInteger | nextProbablePrime() 返回大于这个 |
BigInteger | not() 返回值为 |
BigInteger | or(BigInteger val) 返回值为 |
BigInteger | pow(int exponent) 返回值为 (thisexponent)的BigInteger 。 |
static BigInteger | probablePrime(int bitLength, Random rnd) 返回一个正的BigInteger,它可能是素数,具有指定的位长度。 |
BigInteger | remainder(BigInteger val) 返回值为 |
BigInteger | setBit(int n) 返回一个BigInteger,其值等于具有指定位集合的BigInteger。 |
BigInteger | shiftLeft(int n) 返回值为 |
BigInteger | shiftRight(int n) 返回值为 |
short | shortValueExact() 将此 |
int | signum() 返回此BigInteger的signum函数。 |
BigInteger | subtract(BigInteger val) 返回值为 |
boolean | testBit(int n) 返回 |
byte[] | toByteArray() 返回一个包含此BigInteger的二进制补码表示的字节数组。 |
String | toString() 返回此BigInteger的十进制字符串表示形式。 |
String | toString(int radix) 返回给定基数中BigInteger的String表示形式。 |
static BigInteger | valueOf(long val) 返回一个BigInteger,其值等于指定的 |
BigInteger | xor(BigInteger val) 返回值为 |
BigDecimal | abs() 返回一个 |
BigDecimal | abs(MathContext mc) 返回一个 |
BigDecimal | add(BigDecimal augend) 返回 |
BigDecimal | add(BigDecimal augend, MathContext mc) 返回 |
byte | byteValueExact() 将此 |
int | compareTo(BigDecimal val) 将此 |
BigDecimal | divide(BigDecimal divisor) 返回 |
BigDecimal | divide(BigDecimal divisor, int roundingMode) 返回 |
BigDecimal | divide(BigDecimal divisor, int scale, int roundingMode) 返回一个 |
BigDecimal | divide(BigDecimal divisor, int scale, RoundingMode roundingMode) 返回一个 |
BigDecimal | divide(BigDecimal divisor, MathContext mc) 返回 |
BigDecimal | divide(BigDecimal divisor, RoundingMode roundingMode) 返回 |
BigDecimal[] | divideAndRemainder(BigDecimal divisor) 返回一个两元件 |
BigDecimal[] | divideAndRemainder(BigDecimal divisor, MathContext mc) 返回一个两元件 |
BigDecimal | divideToIntegralValue(BigDecimal divisor) 返回一个 |
BigDecimal | divideToIntegralValue(BigDecimal divisor, MathContext mc) 返回值为 |
double | doubleValue() 将此 |
boolean | equals(Object x) 将此 |
float | floatValue() 将此 |
int | hashCode() 返回此 |
int | intValue() 将此 |
int | intValueExact() 将此 |
long | longValue() 将此 |
long | longValueExact() 将此 |
BigDecimal | max(BigDecimal val) 返回此 |
BigDecimal | min(BigDecimal val) 返回此 |
BigDecimal | movePointLeft(int n) 返回一个 |
BigDecimal | movePointRight(int n) 返回一个 |
BigDecimal | multiply(BigDecimal multiplicand) 返回 |
BigDecimal | multiply(BigDecimal multiplicand, MathContext mc) 返回 |
BigDecimal | negate() 返回 |
BigDecimal | negate(MathContext mc) 返回 |
BigDecimal | plus() 返回 |
BigDecimal | plus(MathContext mc) 返回 |
BigDecimal | pow(int n) 返回 |
BigDecimal | pow(int n, MathContext mc) 返回 |
int | precision() 返回此 BigDecimal的 |
BigDecimal | remainder(BigDecimal divisor) 返回 |
BigDecimal | remainder(BigDecimal divisor, MathContext mc) 返回 |
BigDecimal | round(MathContext mc) 返回 |
int | scale() 返回此 规模 |
BigDecimal | scaleByPowerOfTen(int n) 返回一个BigDecimal,其数值等于( |
BigDecimal | setScale(int newScale) 返回一个 |
BigDecimal | setScale(int newScale, int roundingMode) 返回一个 |
BigDecimal | setScale(int newScale, RoundingMode roundingMode) 返回一个 |
short | shortValueExact() 将此 |
int | signum() 返回这个 |
BigDecimal | stripTrailingZeros() 返回一个 |
BigDecimal | subtract(BigDecimal subtrahend) 返回 |
BigDecimal | subtract(BigDecimal subtrahend, MathContext mc) 返回 |
BigInteger | toBigInteger() 将此 |
BigInteger | toBigIntegerExact() 将此 |
String | toEngineeringString() 如果需要指数,则使用工程符号返回此 |
String | toPlainString() 返回没有指数字段的此 |
String | toString() 返回此 |
BigDecimal | ulp() 返回此 |
BigInteger | unscaledValue() 返回一个 |
static BigDecimal | valueOf(double val) 转换一个 |
static BigDecimal | valueOf(long val) 将 |
static BigDecimal | valueOf(long unscaledVal, int scale) 将 |