Java BigDecimal

定义部分参考 http://www.yiibai.com/java/math/java_math_bigdecimal.html

java.math.BigDecimal 类提供用于算术,刻度操作,舍入,比较,哈希算法和格式转换操作。

toString()方法提供BigDecimal的规范表示。它使用户可以完全控制舍入行为。

提供用于操作BigDecimal规模两种类型的操作:

  • 缩放/舍入操作
  • 小数点移动操作。

此类及其迭代器实现Comparable接口的所有可选方法。

类声明                                               

public class BigDecimal extends Number implements Comparable<BigDecimal>

字段域

以下是java.math.BigDecimal类中的字段:

  • static BigDecimal ONE -- 值为1,使用刻度为0。

  • static BigDecimal TEN -- 值为10,使用刻度为0。

  • static BigDecimal ZERO -- 值为0,使用刻度为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 -- 舍入模式舍入去零。

类构造函数

S.N. 构造函数 & 描述
1 BigDecimal(BigInteger val)
这个构造函数是用来将BigInteger转换为BigDecimal。
2 BigDecimal(BigInteger unscaledVal, int scale)
这个构造函数用于转换为BigInteger非标度值和一个int尺度成一个BigDecimal。
3 BigDecimal(BigInteger unscaledVal, int scale, MathContext mc)
这个构造函数用于转换为BigInteger非标度值和一个int尺度转换为BigDecimal,有根据上下文设置进行舍入。
4 BigDecimal(BigInteger val, MathContext mc)
此构造函数用于根据上下文设置将BigInteger转换为BigDecimal舍入。
5 BigDecimal(char[ ] in)
此构造函数用于将BigDecimal字符数组表示转化为BigDecimal,接受相同的字符序列与BigDecimal(String)构造函数。
6 BigDecimal(char[ ] in, int offset, int len)
此构造函数用于将BigDecimal的字符数组表示转化为BigDecimal,接受字符与BigDecimal(String)构造方法相同的字符序列,同时允许指定子数组。
7 BigDecimal(char[ ] in, int offset, int len, MathContext mc)
此构造函数用于将BigDecimal的字符数组表示转化为BigDecimal,接受字符与BigDecimal(String)构造方法相同的字符序列,同时允许指定子数组,并与根据上下文设置进行舍入。
8 BigDecimal(char[ ] in, MathContext mc)
此构造函数用于将BigDecimal的字符数组表示转化为BigDecimal,接受相同的字符序列与BigDecimal(String)构造和根据上下文设置进行舍入。
9 BigDecimal(double val)
这个构造函数是用来转换double为一个BigDecimal,它是双的二进制浮点值的精确十进制表示。
10 BigDecimal(double val, MathContext mc)
这个构造函数是用来转换double为一个BigDecimal,有根据上下文设置进行舍入。
11 BigDecimal(int val)
这个构造函数是用来转换一个int转换为BigDecimal。
12 BigDecimal(int val, MathContext mc)
这个构造函数是用来转换一个int转换为BigDecimal,有根据上下文设置进行舍入。
13 BigDecimal(long val)
这个构造函数用于转换long为一个BigDecimal。
14 BigDecimal(long val, MathContext mc)
这个构造函数是将BigInteger转换为BigDecimal。
15 BigDecimal(String val)
此构造函数用于一个BigDecimal的字符串表示形式转换为BigDecimal。
16 BigDecimal(String val, MathContext mc)
此构造函数用于将BigDecimal的字符串表示形式转换为BigDecimal,接受相同的字符串作为与BigDecimal(String)构造,并根据上下文设置进行舍入。

类方法

S.N. 方法 & 描述
1 BigDecimal abs() 
此方法返回一个BigDecimal,其值是此BigDecimal的绝对值,其标度是this.scale()。
2 BigDecimal abs(MathContext mc) 
此方法返回一个BigDecimal,其值是此BigDecimal的绝对值,与根据上下文设置进行舍入。
3 BigDecimal add(BigDecimal augend)
此方法返回一个BigDecimal,其值为(this + augend),其标度为max(this.scale(), augend.scale())。
4 BigDecimal add(BigDecimal augend, MathContext mc) 
此方法返回一个BigDecimal,其值为 (this + augend),与根据上下文设置进行舍入。
5 byte byteValueExact() 
这种方法的BigDecimal转换为一个字节,检查丢失的信息。
6 int compareTo(BigDecimal val) 
这种方法比较BigDecimal与指定的BigDecimal。
7 BigDecimal divide(BigDecimal divisor)
此方法返回一个BigDecimal,其值为(this/除数),且其首选标度为(this.scale() - divisor.scale());如果准确的商不能表示(因为它有无穷的十进制扩展),则抛出ArithmeticException。 
8 BigDecimal divide(BigDecimal divisor, int roundingMode)
此方法返回一个BigDecimal,其值为(this/除数),其标度是this.scale()。
9 BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
此方法返回一个BigDecimal,其值为(this/除数),其标度如指定。
10 BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) 
此方法返回一个BigDecimal,其值为(this/除数),其标度为指定。
11 BigDecimal divide(BigDecimal divisor, MathContext mc) 
此方法返回一个BigDecimal,其值为(this/除数),与根据上下文设置进行舍入。
12 BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode)
此方法返回一个BigDecimal,其值为(this/除数),其标度是this.scale()。
13 BigDecimal[ ] divideAndRemainder(BigDecimal divisor)
这个方法返回一个包含divideToIntegralValue结果,其次是剩下的两个操作数的结果的结果由两个元素组成的BigDecimal数组。
14 BigDecimal[ ] divideAndRemainder(BigDecimal divisor, MathContext mc) 
这个方法返回一个包含divideToIntegralValue的结果,随后其余与上根据上下文设置进行舍入计算两个操作数的结果的结果由两个元素组成的BigDecimal数组。
15 BigDecimal divideToIntegralValue(BigDecimal divisor) 
此方法返回一个BigDecimal,其值为商(这/除数)的整数部分四舍五入。
16 BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc)
此方法返回一个BigDecimal,其值是(这/除数)的整数部分。
17 double doubleValue() 
此方法将BigDecimal转换为double。
18 boolean equals(Object x) 
这种方法比较BigDecimal与指定对象是否相等。
19 float floatValue()
这种方法将BigDecimal转换为float。
20 int hashCode() 
此方法返回BigDecimal的哈希代码。
21 int intValue()
这种方法将BigDecimal转换为int。
22 int intValueExact()
这种方法将BigDecimal转换为int,检查丢失的信息。
23 long longValue()
这种方法将BigDecimal转换为long。
24 long longValueExact()
这种方法将BigDecimal转换为long,检查丢失的信息。
25 BigDecimal max(BigDecimal val)
此方法返回此BigDecimal和val的最大值。
26 BigDecimal min(BigDecimal val)
此方法返回此BigDecimal和val的最小值。
27 BigDecimal movePointLeft(int n)
此方法返回一个BigDecimal,它等效于将该值的小数点移动n位到左边。
28 BigDecimal movePointRight(int n) 
此方法返回一个BigDecimal,它等效于将该值的小数点移动n位到右边。
29 BigDecimal multiply(BigDecimal multiplicand)
此方法返回一个BigDecimal,其值为(this×被乘数),其标度为(this.scale()+ multiplicand.scale())。
30 BigDecimal multiply(BigDecimal multiplicand, MathContext mc)
此方法返回一个BigDecimal,其值为(this×乘数),以根据上下文设置进行舍入。
31 BigDecimal negate()
此方法返回一个BigDecimal,其值是(+this),其标度是this.scale()。
32 BigDecimal negate(MathContext mc)
此方法返回一个BigDecimal,其值是(-this),根据上下文设置进行舍入。
33 BigDecimal plus() 
此方法返回一个BigDecimal,其值是(+this),其标度是this.scale()。
34 BigDecimal plus(MathContext mc) 
此方法返回一个BigDecimal,其值是(+this),根据上下文设置进行舍入。
35 BigDecimal pow(int n) 
此方法返回一个BigDecimal,其值是(thisn), 幂被精确计算,使其具有无限精度。
36 BigDecimal pow(int n, MathContext mc)
此方法返回一个BigDecimal,其值是 (thisn).
37 int precision() 
此方法返回此BigDecimal的精度。
38 BigDecimal remainder(BigDecimal divisor) 
此方法将BigDecimal转换为一个byte,检查丢失的信息。
39 BigDecimal remainder(BigDecimal divisor, MathContext mc)
此方法返回一个BigDecimal,其值为(this%除数),根据上下文设置进行舍入。
40 BigDecimal round(MathContext mc) 
此方法返回根据MathContext设置舍入一个BigDecimal。
41 int scale() 
此方法返回此BigDecimal的标度。
42 BigDecimal scaleByPowerOfTen(int n) 
此方法返回一个BigDecimal,其数值等于 (this * 10n).
43 BigDecimal setScale(int newScale)
此方法返回一个BigDecimal,其标度为指定值,其值在数值上等于该BigDecimal。
44 BigDecimal setScale(int newScale, int roundingMode) 
此方法返回一个BigDecimal,其标度为指定值,其非标度值乘以或除以此BigDecimal的非标度值除以十的次幂,以保持其整体值决定。
45 BigDecimal setScale(int newScale, RoundingMode roundingMode) 
此方法返回一个BigDecimal,其标度为指定值,其非标度值乘以或除以此BigDecimal的非标度值除以十的次幂,以保持其整体价决定。
46 short shortValueExact()
这种方法将BigDecimal转换为short,检查丢失的信息。
47 int signum()
此方法返回此BigDecimal的正负号函数。
48 BigDecimal stripTrailingZeros() 
此方法返回一个BigDecimal,它在数值上等于这一个,但与从表示形式移除所有尾部零。
49 BigDecimal subtract(BigDecimal subtrahend) 
此方法返回一个BigDecimal,其值为(this - 减数),其标度为max(this.scale(),subtrahend.scale())。
50 BigDecimal subtract(BigDecimal subtrahend, MathContext mc) 
此方法返回一个BigDecimal,其值为(this - 减数),与根据上下文设置进行舍入。
51 BigInteger toBigInteger() 
这种方法将BigDecimal转换为BigInteger。
52 BigInteger toBigIntegerExact()
这种方法将BigDecimal转换为BigInteger,检查丢失的信息。
53 String toEngineeringString() 
此方法返回此BigDecimal的字符串表示形式,使用工程计数法,如果需要指数。
54 String toPlainString() 
此方法返回此BigDecimal的字符串表示形式不带指数字段。
55 String toString()
此方法返回此BigDecimal的字符串表示形式,用科学记数法,如果需要指数。
56 BigDecimal ulp()
此方法返回一个ULP的此BigDecimal的大小,在最后一位的单位。
57 BigInteger unscaledValue()
此方法返回一个BigInteger,其值是此BigDecimal的非标度值。
58 static BigDecimal valueOf(double val) 
这种方法转换double为一个BigDecimal,使用Double.toString(double)方法提供的double的规范化字符串表示形式。
59 static BigDecimal valueOf(long val)
这种方法将一个long值转换为BigDecimal带有刻度的零值。
60 static BigDecimal valueOf(long unscaledVal, int scale)
这种方法转换long的非标度值和一个int尺度成一个BigDecimal。

代码实战

package com.demo.test;

import java.math.BigDecimal;

public class BigDecimalDemo {

	public static void main(String[] args) {
		BigDecimal bigDecimal1= new BigDecimal(05040306.5201992201609803);
		BigDecimal bigDecimal2= new BigDecimal(10000000000000.5201992201609803);
		BigDecimal bigDecimal3 = new BigDecimal(1.000000000000001);//14个0
		BigDecimal bigDecimal4 = new BigDecimal(1.0000000000000001);//15个0
		BigDecimal bigDecimal5 = new BigDecimal(0.000005201992201609803);//5个0,位数太少,不会以指数形式表示
		BigDecimal bigDecimal6 = new BigDecimal(0.0000005201992201609803);
		BigDecimal bigDecimal7 = new BigDecimal(0.00000005201992201609803);
		BigDecimal bigDecimal8 = new BigDecimal(0.000000005201992201609803);
		BigDecimal bigDecimal9 = new BigDecimal(0.0000000005201992201609803);
		BigDecimal bigDecimal10 = new BigDecimal(1E-10);
		
		printString(bigDecimal1);
		printString(bigDecimal2);
		printString(bigDecimal3);
		printString(bigDecimal4);
		printString(bigDecimal5);
		printString(bigDecimal6);
		printString(bigDecimal7);
		printString(bigDecimal8);
		printString(bigDecimal9);
		printString(bigDecimal10);
		System.out.println("==============================");
		
		BigDecimal bigDecimal11 = new BigDecimal(11);
		//加
		BigDecimal bigDecimal12 = bigDecimal11.add(new BigDecimal("-1"));
		//减
		BigDecimal bigDecimal13 = bigDecimal11.subtract(new BigDecimal(-1));
		//乘
		BigDecimal bigDecimal14 = bigDecimal11.multiply(new BigDecimal("2.0"));
		//除
		BigDecimal bigDecimal15 = bigDecimal11.divide(new BigDecimal(2.0));
		System.out.println("add\t\t" + bigDecimal12);
		System.out.println("subtract\t" + bigDecimal13);
		System.out.println("multiply\t" + bigDecimal14);
		System.out.println("divide\t\t" + bigDecimal15);
		System.out.println("==============================");
		
		System.out.println("BigDecimal.TEN\t" + BigDecimal.TEN.toPlainString());
		System.out.println("BigDecimal.ONE\t" + BigDecimal.ONE.toPlainString());
		System.out.println("BigDecimal.ZERO\t" + BigDecimal.ZERO.toPlainString());
		System.out.println("BigDecimal(10)\t" + new BigDecimal(10).toPlainString());
		System.out.println("BigDecimal(1)\t" + new BigDecimal(1).toPlainString());
		System.out.println("BigDecimal(0)\t" + new BigDecimal(0).toPlainString());
		System.out.println("==============================");
		
		BigDecimal bigDecimal16 = new BigDecimal(12.3456);
		BigDecimal bigDecimal17 = new BigDecimal(12.3445);
		BigDecimal bigDecimal18 = new BigDecimal(12.3444);
		BigDecimal bigDecimal19 = new BigDecimal(-12.3456);
		BigDecimal bigDecimal20 = new BigDecimal(-12.3445);
		BigDecimal bigDecimal21 = new BigDecimal(-12.3444);
		printRound(bigDecimal16);
		printRound(bigDecimal17);
		printRound(bigDecimal18);
		printRound(bigDecimal19);
		printRound(bigDecimal20);
		printRound(bigDecimal21);
	}
	
	public static void printString(BigDecimal bigDecimal) {
		//大于小数点后5个0的数都不会以指数形式表示
		System.out.println(bigDecimal.toString());
		//返回此BigDecimal的字符串表示形式不带指数字段
		System.out.println(bigDecimal.toPlainString());
		//如果指数表示法时,10的次幂被调整为三个(工程符号)的倍数,这样的非零值的整数部分将取值范围为1到999
		System.out.println(bigDecimal.toEngineeringString());
		System.out.println();
	}
	
	public static void printRound(BigDecimal bigDecimal) {
		//error: java.lang.ArithmeticException: Rounding necessary
		//BigDecimal bigDecimal1 = bigDecimal.setScale(2);
		
		/*
		 error: java.lang.ArithmeticException: Rounding necessary
		 Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. If this rounding mode is specified on an operation that yields an inexact result, an ArithmeticException is thrown.
		 */
		//BigDecimal bigDecimal2 = bigDecimal.setScale(2, BigDecimal.ROUND_UNNECESSARY);
		
		/*
		 Rounding mode to round away from zero. 
		 Always increments the digit prior to a nonzero discarded fraction.
		 Note that this rounding mode never decreases the magnitude of the calculated value.
		"向上凑整"模式
		  远离"0"的方向凑整的模式
		 在舍弃一个非零的小数之前总是增加该数
		 注意:该凑整模式不会减小算出来数的量级的大小(即"算出来的数的绝对值"比"原数的绝对值"要大)
		 */
		BigDecimal bigDecimal3 = bigDecimal.setScale(2, BigDecimal.ROUND_UP);
		
		/*
		 Rounding mode to round towards zero. 
		 Never increments the digit prior to a discarded fraction (i.e., truncates). 
		 Note that this rounding mode never increases the magnitude of the calculated value.
		 "向下凑整"模式
		   朝向"0"的方向凑整的模式
		   在舍弃一个非零的小数之前从来不增加该数(也就是说,截短)
		   注意:该凑整模式不会增加算出来数的量级的大小(即"算出来的数的绝对值"比"原数的绝对值"要小)
		 */
		BigDecimal bigDecimal4 = bigDecimal.setScale(2, BigDecimal.ROUND_DOWN);
		
		/*
		 Rounding mode to round towards negative infinity. 
		 If the BigDecimal is positive, behave as for ROUND_DOWN; if negative, behave as for ROUND_UP. 
		 Note that this rounding mode never increases the calculated value.
		"天花板凑整"模式
	 	 朝向"正无穷"方向凑整的模式
		 如果这个数是正数,表现为"ROUND_UP"模式;如果是负数,表现为"ROUND_DOWN"模式
		 注意:该凑整模式不会减少算出来的值(即得出的值不会比原值小)
		 */
		BigDecimal bigDecimal5 = bigDecimal.setScale(2, BigDecimal.ROUND_CEILING);
		
		/*
		 Rounding mode to round towards positive infinity. 
		 If the BigDecimal is positive, behaves as for ROUND_UP; if negative, behaves as for ROUND_DOWN. 
		 Note that this rounding mode never decreases the calculated value
		 "地板凑整"模式
		   朝向"负无穷"方向的凑整模式
		   如果这个数是正数,表现为"ROUND_DOWN"模式;如果这个数是负数,表现为"ROUND_UP"模式
		   注意:该凑整模式不会增加算出来的值(即得出的值不会比原值大)
		 */
		BigDecimal bigDecimal6 = bigDecimal.setScale(2, BigDecimal.ROUND_FLOOR);

		/*
		 Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up. 
		 Behaves as for ROUND_UP if the discarded fraction is ≥ 0.5; otherwise, behaves as for ROUND_DOWN. 
		 Note that this is the rounding mode that most of us were taught in grade school.
		 "半数向上凑整"模式
		 朝着相邻的方向凑整,除非相邻的距离相等,这种情况下,会向上取整
		 如果被舍弃的小数部分>=0.5,则表现为ROUND_UP,否则表现为ROUND_DOWN
		注意:该凑整模式,大多数人在学校就被教过
		 */
		BigDecimal bigDecimal7 = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
		
		/*
		 Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down.
		 Behaves as for ROUND_UP if the discarded fraction is > 0.5; otherwise, behaves as for ROUND_DOWN
		 "半数向下凑整"模式
  		  朝着相邻的方向凑整,除非相邻的距离相等,这种情况下,会向下取整
  		  如果被舍弃的小数部分>0.5,则表现为ROUND_UP,否则表现为ROUND_DOWN
		 */
		BigDecimal bigDecimal8 = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_DOWN);
		
		/*
		 Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor. 
		 Behaves as for ROUND_HALF_UP if the digit to the left of the discarded fraction is odd; behaves as for ROUND_HALF_DOWN if it's even. 
		 Note that this is the rounding mode that minimizes cumulative error when applied repeatedly over a sequence of calculations.
		 "半数向偶数凑整"模式
		  朝着相邻的方向凑整,除非相邻的距离相等,这种情况下,朝偶数的方向凑整
		  舍弃小数后,如果这个数是奇数(odd),则表现为"ROUND_HALF_UP";如果是偶数(even),则表现为"ROUND_HALF_DOWN"
		  注意:该凑整模式在我们进行一系列重复性的计算时,会将累积的错误降到最低
		 */
		BigDecimal bigDecimal9 = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_EVEN);
		
		System.out.println("bigDecimal = " + bigDecimal.toPlainString());
		System.out.println("ROUND_UP\t" + bigDecimal3.toPlainString());
		System.out.println("ROUND_DOWN\t" + bigDecimal4.toPlainString());
		System.out.println("ROUND_CEILING\t" + bigDecimal5.toPlainString());
		System.out.println("ROUND_FLOOR\t" + bigDecimal6.toPlainString());
		System.out.println("ROUND_HALF_UP\t" + bigDecimal7.toPlainString());
		System.out.println("ROUND_HALF_DOWN\t" + bigDecimal8.toPlainString());
		System.out.println("ROUND_HALF_EVEN\t" + bigDecimal9.toPlainString());
		System.out.println();
	}

}

运行截图


2016-08-10更新

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

      通俗的说:precision是第一个非0数开始算起的位数(不包括小数点),scale是小数点后面的位数。

代码验证

//0.0012345669,9999999999,9462763078,3838867500,8900463581,0852050781,25
BigDecimal decimal = new BigDecimal(0.001234567);
System.out.println(decimal.toPlainString());
System.out.println(decimal.precision() + " & " + decimal.scale());//60 & 62

//0.1234567000,0000000254,8361521803,5993166267,8718566894,53125
decimal = new BigDecimal(0.1234567);
System.out.println(decimal.toPlainString());
System.out.println(decimal.precision() + " & " + decimal.scale());//55 & 55

//-0.1234567000,0000000254,8361521803,5993166267,8718566894,53125
decimal = new BigDecimal(-0.1234567);
System.out.println(decimal.toPlainString());
System.out.println(decimal.precision() + " & " + decimal.scale());//55 & 55

//123.4567890123,0000690247,8344272822,1416473388,671875
decimal = new BigDecimal(123.4567890123);
System.out.println(decimal.toPlainString());
System.out.println(decimal.precision() + " & " + decimal.scale());//49 & 46

//123
decimal = new BigDecimal(123);
System.out.println(decimal.toPlainString());
System.out.println(decimal.precision() + " & " + decimal.scale());//3 & 0

运行结果


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值