我们知道Java 自带的整数类型和浮点类型都有最大限制,整数类型long类型 (8个字节,一个字节8个bit位,-2 ^ 63 ~ (2 ^63) -1),而如果数字超过这个范围,就会编译不通过,也就无法进行各种操作,所以出现BigInteger类型对整数类型的大数字进行处理,
而浮点类型double类型的范围(-2^1074~(2^1024) -1),超过这个范围也会编译不通过,或者报类型错误,所以对应出现对浮点类型的大数字类BigDecimal,这也是java 对数字类型规定太严格导致的,每种数字类型转换很麻烦,如果有企业开发或金融开放的行业,对大数字应该比较敏感,如果数字太长存在数据库,直接显示出来有时候就是科学记数法带E类型,这样很不直观,而BigDecimal如果数字类型太长直接toString()方法也会以科学记数法显示.参见:数据库问题整理
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)指定返回的字符串的进制位数
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方法较多,但用的较多的也就是这些方法
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 舍入远离零的舍入模式。 |