Java BigDecimal详解,提供了丰富的四舍五入规则
java.math.BigDecimal类提供用于算术,刻度操作,舍入,比较,哈希算法和格式转换操作。
toString()方法提供BigDecimal的规范表示。它使用户可以完全控制舍入行为。
提供用于操作BigDecimal规模两种类型的操作:
- 缩放/舍入操作
- 小数点移动操作。
此类及其迭代器实现Comparable接口的所有可选方法。
一、类的详解
类声明
1
2
|
public class BigDecimal extends Number implements Comparable<bigdecimal> </bigdecimal> |
字段域
以下是java.math.BigDecimal类中的字段:
-
static BigDecimal ONE-- 值为1,使用刻度为0。
-
static BigDecimal TEN--值为10,使用刻度为0。
-
static BigDecimal ZERO--值为0,使用刻度为0。
-
static int ROUND_CEILING-- 舍入模式舍向正无穷。正数效果同ROUND_UP举例如:1.239得到的是1.24;负数效果举例如:-1.239得到的是-1.23
-
static int ROUND_DOWN-- 舍入模式,向零舍入(即舍弃后边所有,不向前进1)。
-
static int ROUND_FLOOR-- 舍入模式接近负无穷大。正数效果同ROUND_DOWN举例如:1.239得到的是1.23;负数效果举例如:-1.239得到的是-1.23
-
static int ROUND_HALF_DOWN-- 遵循四舍五入规则,大于5向前一位进1。
-
static int ROUND_HALF_EVEN-- 舍入模式舍对“近邻”如果与两个相邻数字的距离相等,在这种情况下,舍入向着更加相邻(正负数都是向着0相邻舍入)。
-
static int ROUND_HALF_UP-- 遵循四舍五入规则,大于等于5向前一位进1。
-
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 pide(BigDecimal pisor) 此方法返回一个BigDecimal,其值为(this/除数),且其首选标度为(this.scale() - pisor.scale());如果准确的商不能表示(因为它有无穷的十进制扩展),则抛出ArithmeticException。 |
8 | BigDecimal pide(BigDecimal pisor, int roundingMode) 此方法返回一个BigDecimal,其值为(this/除数),其标度是this.scale()。 |
9 | BigDecimal pide(BigDecimal pisor, int scale, int roundingMode) 此方法返回一个BigDecimal,其值为(this/除数),其标度如指定。 |
10 | BigDecimal pide(BigDecimal pisor, int scale, RoundingMode roundingMode) 此方法返回一个BigDecimal,其值为(this/除数),其标度为指定。 |
11 | BigDecimal pide(BigDecimal pisor, MathContext mc) 此方法返回一个BigDecimal,其值为(this/除数),与根据上下文设置进行舍入。 |
12 | BigDecimal pide(BigDecimal pisor, RoundingMode roundingMode) 此方法返回一个BigDecimal,其值为(this/除数),其标度是this.scale()。 |
13 | BigDecimal[ ] pideAndRemainder(BigDecimal pisor) 这个方法返回一个包含pideToIntegralValue结果,其次是剩下的两个操作数的结果的结果由两个元素组成的BigDecimal数组。 |
14 | BigDecimal[ ] pideAndRemainder(BigDecimal pisor, MathContext mc) 这个方法返回一个包含pideToIntegralValue的结果,随后其余与上根据上下文设置进行舍入计算两个操作数的结果的结果由两个元素组成的BigDecimal数组。 |
15 | BigDecimal pideToIntegralValue(BigDecimal pisor) 此方法返回一个BigDecimal,其值为商(这/除数)的整数部分四舍五入。 |
16 | BigDecimal pideToIntegralValue(BigDecimal pisor, 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 pisor) 此方法将BigDecimal转换为一个byte,检查丢失的信息。 |
39 | BigDecimal remainder(BigDecimal pisor, 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。 |
鸣谢:https://www.2cto.com/kf/201608/533725.html
二、类的应用
在java中,两个浮点数进行加减运算,和乘除中不是整数的运算,这些的运算结果将可能被显示出更多的小数位。所以就需要用到BigDecimal类提供的运算方法进行运算。
举例说明:两个数相乘。
方式一:
BigDecimal bigDecimal1=new BigDecimal(1.2);
BigDecimal bigDecimal2=new BigDecimal(2);
String result=bigDecimal1.multiply(bigDecimal2).toPlainString()
结果是:result=2.3999999999999999999.......;
BigDecimal bigDecimal1=new BigDecimal(1.2+"");
BigDecimal bigDecimal2=new BigDecimal(2+"");
String result=bigDecimal1.multiply(bigDecimal2).toPlainString()
结果是:result=2.4;
通过上面例子的对比,可知,在这种情况之下,进行加减乘除运算时,创建BigDecimal对象时,传入的参数要用字符串。