java BigInteger 类和BigDecimal类,大数字处理类型

介绍大数字类出现的原因

我们知道Java 自带的整数类型和浮点类型都有最大限制,整数类型long类型 (8个字节,一个字节8个bit位,-2 ^ 63 ~ (2 ^63) -1),而如果数字超过这个范围,就会编译不通过,也就无法进行各种操作,所以出现BigInteger类型对整数类型的大数字进行处理,

而浮点类型double类型的范围(-2^1074~(2^1024)  -1),超过这个范围也会编译不通过,或者报类型错误,所以对应出现对浮点类型的大数字类BigDecimal,这也是java 对数字类型规定太严格导致的,每种数字类型转换很麻烦,如果有企业开发或金融开放的行业,对大数字应该比较敏感,如果数字太长存在数据库,直接显示出来有时候就是科学记数法带E类型,这样很不直观,而BigDecimal如果数字类型太长直接toString()方法也会以科学记数法显示.参见:数据库问题整理

BigInteger

javadoc 定义:BigInteger 不可变的任意精度的整数,所有操作都以二进制补码的形式BigInteger(和Java基本整数类型一致),BigInteger提供了所有java基本整数操作符的对应方法,并提供了java.lang.Math的所有相关方法,另外,BigInteger还提供以下运算:模运算,GCD计算,质数测试,素数生成,位操作以及一些其他操作

构造方法:

BigInteger(byte[] val)
          将包含 BigInteger 的二进制补码表示形式的 byte 数组转换为 BigInteger。
BigInteger(int signum, byte[] magnitude)
          将 BigInteger 的符号-数量表示形式转换为 BigInteger。
BigInteger(int bitLength, int certainty, Random rnd)
          构造一个随机生成的正 BigInteger,它可能是一个具有指定 bitLength 的素数。
BigInteger(int numBits, Random rnd)
          构造一个随机生成的 BigInteger,它是在 0(2numBits - 1)(包括)范围内均匀分布的值。
BigInteger(String val)
          将 BigInteger 的十进制字符串表示形式转换为 BigInteger。
BigInteger(String val, int radix)

          将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger

常用的构造就是BigInteger(String val) ;将十进制字符串转为BigInteger类型,因为数字类型都可以通过String.valueOf(val)容易转换为String 类型,

进制转换:BigInteger(String val,int radix);这个方法可以结合toString();(总是返回十进制类型的字符串)很方便对进制进行转换,不过就是要多几步把数字转成String,然后在从String转回来,或者结合toString(int radix)指定返回的字符串的进制位数

常用方法:

abs();返回BigInteger绝对值表示形式

subtract(BigInteger val);返回其值为 (this - val) 的 BigInteger。减法

add(BigInteger val) ;返回一个BigInteger值与另一个BigInteger值相加后的BIgInteger值,加法

and(BigInteger val); 返回其值为 (this & val) 的 BigInteger。

compareTo(BigInteger val);BigIntege与val比较大小,当此 BigInteger 在数值上小于、等于或大于 val 时,返回 -1,0,或1。

divide(BigInteger val);求除数,不带小数值,返回其值为 (this / val) 的 BigInteger。

remainder(BigInteger val);求余数,返回其值为 (this % val) 的BigInteger。

multiply(BigInteger val);返回其值为 (this * val) 的 BigInteger。

pow(BigInteger val);此 BigInteger 的指数,返回 this ^ val的BigInteger

shiftLeft(BigInteger val);返回其值为 (this << n) 的 BigInteger。相当于左移

shiftRight(BigInteger val);返回其值为 (this >> n) 的 BigInteger。右移

toString();返回此 BigInteger 的十进制字符串表示形式。

toString(int radix); 返回此 BigInteger 的给定基数的字符串表示形式。

intValue();将此 BigInteger 转换为int

longValue(); 将此 BigInteger 转换为 long

BigInteger方法较多,但用的较多的也就是这些方法

BigDecimal

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

BigDecimal类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换.toString() 方法提供 BigDecimal 的规范表示形式。BigDecimal 类使用户能完全控制舍入行为。如果未指定舍入模式,并且无法表示准确结果,则抛出一个异常;

构造方法:

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(double val);将double类型转换为BigDecimal类型

BigDecimal(BigInteger val);将BigInteger类型转换为BigDecimal类型

BigDecimal(BigInteger String);将十进制String类型的浮点数转为BigDecimal类型

常用方法

加(add(val)),减(subtract(val)),乘法(multiply(val)),除法(divide(val)),求余(remainder(val)),比较(compareTo(val)),等等一大堆数值操作的方法和BigDecimal相似就不多说,

值得注意的:

1. 3个返回字符串的方法很不相同

toStringPlan();推荐使用这个方法,返回不带指数的形式的数值字符串

toString();可能会返回带指数的科学记数法表示形式

toEnginneringString(); 返回此 BigDecimal 的字符串表示形式,需要指数时,则使用工程计数法。

2. 对负数的不友好,指代如果操作负数的BigDecimal值,会以非标度值的正数形式来表示,有时候会混淆,而且看着很不直观,如果中间有其他操作,可能会出错

3. 由于多了小数,也没有提供进制转换的方法

4. 8种舍入模式

例如:BigDecimal bg = new BigDecimal(amount);
        bg = bg.setScale(2, BigDecimal.ROUND_UP);//进位

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



猜你喜欢

转载自blog.csdn.net/kzcming/article/details/80420037