概述
目录
- BigDecimal的方法介绍
- valueOf
- add
- subtract
- multiply
- devide
- divideToIntegralValue
- remainder
- divideAndRemainder
- sqrt
- pow
- abs
- negate
- plus
- signum
- scale
- precision
- unscaledValue
- round
- setScale
- movePointLeft
- movePointRight
- scaleByPowerOfTen
- stripTrailingZeros
- compareTo
- equals
- min
- max
- hashCode
- toString
- toEngineeringString
- toPlainString
- toBigInteger longValue intValue floatValue doubleValue
- toBigIntegerExact longValueExact intValueExact shortValueExact byteValueExact
- ulp
BigDecimal的方法介绍
本文使用的是jdk11的版本
valueOf
参数要求:
public static BigDecimal valueOf(long unscaledVal, int scale)
public static BigDecimal valueOf(long val)
public static BigDecimal valueOf(double val)
方法作用:
如果是一个long类型或一个double类型的参数,通过这个方法可以将其转化位一个BigDecimal的类型。
如果输入了一个long类型,又输入了一个int类型的参数a,得到的结果是这个long类型数乘以10的负a次方之后用科学计数法计数的结果。
代码示例:
BigDecimal bdtest1 = BigDecimal.valueOf(8.25);
BigDecimal bdtest2 = BigDecimal.valueOf(500L);
BigDecimal bdtest3 = BigDecimal.valueOf(50L,3);
BigDecimal bdtest4 = BigDecimal.valueOf(5L,5);
System.out.println("bdtest1 = " + bdtest1);
System.out.println("bdtest2 = " + bdtest2);
System.out.println("bdtest3 = " + bdtest3);
System.out.println("bdtest4 = " + bdtest4);
代码结果:
add
参数要求:
public BigDecimal add(BigDecimal augend)
public BigDecimal add(BigDecimal augend, MathContext mc)
方法作用:
两个BigDecimal类型的数相加,或者以某种精度要求相加
代码示例:
BigDecimal bdTest1 = new BigDecimal("10000");
BigDecimal bdTest2 = new BigDecimal(500.005);
BigDecimal bdTest3 = new BigDecimal("500.005");
BigDecimal addTest1 = bdtest1.add(bdTest2);
BigDecimal addTest2 = bdtest1.add(bdTest3);
BigDecimal addTest3 = bdtest1.add(bdTest3,new MathContext(7));
System.out.println("addtest1 = " + addTest1);
System.out.println("addtest2 = " + addTest2);
System.out.println("addtest3 = " + addTest3);
代码结果图示:
还是可以看出double的值是很不准确的…
subtract
参数要求:
public BigDecimal subtract(BigDecimal subtrahend)
public BigDecimal subtract(BigDecimal subtrahend, MathContext mc)
方法作用:
让两个BigDecimal的值相减,如果是A.subtract(B),则结果是A-B。如果加入MathContext,那么会控制结果的精度。
代码示例:
BigDecimal bdTest1 = new BigDecimal("50");
BigDecimal bdTest2 = new BigDecimal(47.965);
BigDecimal bdTest3 = new BigDecimal("47.965");
BigDecimal test1 = bdTest1.subtract(bdTest2);
BigDecimal test2 = bdTest1.subtract(bdTest3);
BigDecimal test3 = bdTest1.subtract(bdTest3,new MathContext(3));
System.out.println("test1 = " + test1);
System.out.println("test2 = " + test2);
System.out.println("test3 = " + test3);
代码结果图示:
multiply
参数要求:
public BigDecimal multiply(BigDecimal multiplicand)
public BigDecimal multiply(BigDecimal multiplicand, MathContext mc)
方法作用:
获得两个BigDecimal类型的数相乘的结果,两个参数的话第二个参数是对结果的精度以及四舍五入进行规定。
代码示例:
BigDecimal bdTest1 = new BigDecimal("5");
BigDecimal bdTest2 = new BigDecimal(4.55);
BigDecimal bdTest3 = new BigDecimal("4.55");
BigDecimal test1 = bdTest1.multiply(bdTest2);
BigDecimal test2 = bdTest1.multiply(bdTest3);
BigDecimal test3 = bdTest1.multiply(bdTest3,new MathContext(3));
System.out.println("test1 = " + test1);
System.out.println("test2 = " + test2);
System.out.println("test3 = " + test3);
代码结果图示:
可以看出来就算使用BigDecimal类型进行操作,但是输入的参数类型如果是double那么最终结果也可能会出现大问题。
devide
参数要求:
1.public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
2.public BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode)
3.public BigDecimal divide(BigDecimal divisor)
4.public BigDecimal divide(BigDecimal divisor, MathContext mc)
方法作用:
4个方法构造分别是:
1.规定四舍五入标准,给定小数点后的位数,得到this/divide
2.规定四舍五入标准,得到this/divide
3.得到this/divide
4.通过MathContext规定四舍五入标准以及精度,得到this/divide
代码示例:
BigDecimal bdTest1 = new BigDecimal("50");
BigDecimal bdTest2 = new BigDecimal("3");
//第一种形式
BigDecimal test1 = bdTest1.divide(bdTest2,5,RoundingMode.UP);
//第二种形式
BigDecimal test2 = bdTest1.divide(bdTest2,RoundingMode.UP);
//第三种形式
BigDecimal test3 = bdTest1.divide(new BigDecimal(25));
//第四种形式
BigDecimal test4 = bdTest1.divide(bdTest2,new MathContext(4));
System.out.println("test1 = " + test1);
System.out.println("test2 = " + test2);
System.out.println("test3 = " + test3);
System.out.println("test4 = " + test4);
代码结果图示:
这里我们可以看到第三个方法我改变了数值,因为这个方法使用其他方法的数据时出现了错误,于是我想着对这个错误研究一下 下面的是报错提示
错误时的代码:
BigDecimal bdTest1 = new BigDecimal("50");
BigDecimal bdTest2 = new BigDecimal("3");
//第一种形式
BigDecimal test1 = bdTest1.divide(bdTest2,5,RoundingMode.UP);
//第二种形式
BigDecimal test2 = bdTest1.divide(bdTest2,RoundingMode.UP);
//第三种形式
BigDecimal test3 = bdTest1.divide(bdTest2);//167行
//第四种形式
BigDecimal test4 = bdTest1.divide(bdTest2,new MathContext(4));
System.out.println("test1 = " + test1);
System.out.println("test2 = " + test2);
System.out.println("test3 = " + test3);
System.out.println("test4 = " + test4);
错误图示:
根据源码的阅读,我发现他一开始判断了除数与被除数是否为0之外,还判断结果是否为一个无限循环的小数,如果无限循环就会报上面的错误。
源码:
public BigDecimal divide(BigDecimal divisor) {
/*
* Handle zero cases first.
*/
if (divisor.signum() == 0) { // x/0
if (this.signum() == 0) // 0/0
throw new ArithmeticException("Division undefined"); // NaN
throw new ArithmeticException("Division by zero");
}
// Calculate preferred scale
int preferredScale = saturateLong((long) this.scale - divisor.scale);
if (this.signum() == 0) // 0/y
return zeroValueOf(preferredScale);
else {
/*
* If the quotient this/divisor has a terminating decimal
* expansion, the expansion can have no more than
* (a.precision() + ceil(10*b.precision)/3) digits.
* Therefore, create a MathContext object with this
* precision and do a divide with the UNNECESSARY rounding
* mode.
*/
MathContext mc = new MathContext( (int)Math.min(this.precision() +
(long)Math.ceil(10.0*divisor.precision()/3.0),
Integer.MAX_VALUE),
RoundingMode.UNNECESSARY);
BigDecimal quotient;
try {
quotient = this.divide(divisor, mc);
} catch (ArithmeticException e) {
throw new ArithmeticException("Non-terminating decimal expansion; " +
"no exact representable decimal result.");
}
int quotientScale = quotient.scale();
// divide(BigDecimal, mc) tries to adjust the quotient to
// the desired one by removing trailing zeros; since the
// exact divide method does not have an explicit digit
// limit, we can add zeros too.
if (preferredScale > quotientScale)
return quotient.setScale(preferredScale, ROUND_UNNECESSARY);
return quotient;
}
}
divideToIntegralValue
参数要求:
public BigDecimal divideToIntegralValue(BigDecimal divisor)
public BigDecimal divideToIntegralValue(BigDecimal divisor, MathContext mc)
方法作用:
返回this/divisor的整数值
代码示例:
BigDecimal bdTest1 = new BigDecimal("7000");
BigDecimal bdTest2 = new BigDecimal("7");
BigDecimal test1 = bdTest1.divideToIntegralValue(bdTest2);
BigDecimal test2 = bdTest1.divideToIntegralValue(bdTest2,new MathContext(2));
System.out.println("test1 = " + test1);
System.out.println("test2 = " + test2);
代码结果图示:
remainder
参数要求:
public BigDecimal remainder(BigDecimal divisor)
public BigDecimal remainder(BigDecimal divisor, MathContext mc)
方法作用:
取模运算,结果为this%divisor,有些时候结果为负数
代码示例:
BigDecimal bdTest1 = new BigDecimal("50");
BigDecimal bdTest2 = new BigDecimal("40");
BigDecimal bdTest3 = new BigDecimal("-50");
BigDecimal bdTest4 = new BigDecimal("-40");
BigDecimal test1 = bdTest1.remainder(bdTest2);
BigDecimal test2 = bdTest1.remainder(bdTest4);
BigDecimal test3 = bdTest3.remainder(bdTest2);
BigDecimal test4 = bdTest3.remainder(bdTest4);
BigDecimal test5 = bdTest1.remainder(bdTest2,new MathContext(1));
System.out.println("test1 = " + test1);
System.out.println("test2 = " + test2);
System.out.println("test3 = " + test3);
System.out.println("test4 = " + test4);
System.out.println("test5 = " + test5);
代码结果图示:
divideAndRemainder
参数要求:
public BigDecimal[] divideAndRemainder(BigDecimal divisor)
public BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc)
方法作用:
返回一个BigDecimal的两位数组,第一个数存储整数的除结果,第二个数存储模的值
代码示例:
BigDecimal bdTest1 = new BigDecimal("50");
BigDecimal bdTest2 = new BigDecimal("40");
BigDecimal[] test = bdTest1.divideAndRemainder(bdTest2);
BigDecimal[] test2 = bdTest1.divideAndRemainder(bdTest2,new MathContext(1));
for (BigDecimal b:test) {
System.out.println(b);
}
for (BigDecimal b:test2) {
System.out.println(b);
}
代码结果图示:
sqrt
参数要求:
public BigDecimal sqrt(MathContext mc)
方法作用:
根据精度以及四舍五入的设置获得BigDecimal的开方
代码示例:
BigDecimal bdTest1 = new BigDecimal("225");
BigDecimal test = bdTest1.sqrt(new MathContext(2));
BigDecimal test1 = bdTest1.sqrt(new MathContext(1));
System.out.println("test = " + test);
System.out.println("test1 = " + test1);
代码结果图示:
pow
参数要求:
public BigDecimal pow(int n)
public BigDecimal pow(int n, MathContext mc)
方法作用:
计算BigDecimal的n次方
代码示例:
BigDecimal bdTest1 = new BigDecimal("2");
BigDecimal test = bdTest1.pow(2);
BigDecimal test1 = bdTest1.pow(10);
BigDecimal test2 = bdTest1.pow(10,new MathContext(3));
System.out.println("test = " + test);
System.out.println("test1 = " + test1);
System.out.println("test2 = " + test2);
代码结果图示:
abs
参数要求:
public BigDecimal abs()
public BigDecimal abs(MathContext mc)
方法作用:
获得BigDecimal类型值的绝对值
代码示例:
BigDecimal bdTest1 = new BigDecimal("2.555");
BigDecimal bdTest2 = new BigDecimal("-2");
System.out.println(bdTest1.abs());
System.out.println(bdTest2.abs());
System.out.println(bdTest1.abs(new MathContext(3)));
代码结果图示:
negate
参数要求:
public BigDecimal negate()
public BigDecimal negate(MathContext mc)
方法作用:
为BigDecimal类型值添加负号
代码示例:
BigDecimal bdTest1 = new BigDecimal("2.555");
BigDecimal bdTest2 = new BigDecimal("-2");
System.out.println(bdTest1.negate());
System.out.println(bdTest2.negate());
System.out.println(bdTest1.negate(new MathContext(3)));
代码结果图示:
plus
参数要求:
public BigDecimal plus()
public BigDecimal plus(MathContext mc)
方法作用:
返回自己 源码如下:
public BigDecimal plus() {
return this;
}
代码示例:
BigDecimal bdTest1 = new BigDecimal("2.555");
BigDecimal bdTest2 = new BigDecimal("-2");
System.out.println(bdTest1.plus());
System.out.println(bdTest2.plus());
System.out.println(bdTest1.plus(new MathContext(3)));
代码结果图示:
signum
参数要求:
public int signum()
方法作用:
根据数的正负返回1,-1,0
代码示例:
BigDecimal bdTest1 = new BigDecimal("200.555");
BigDecimal bdTest2 = new BigDecimal("-2");
BigDecimal bdTest3 = new BigDecimal("0");
System.out.println(bdTest1.signum());
System.out.println(bdTest2.signum());
System.out.println(bdTest3.signum());
代码结果图示:
scale
参数要求:
public int scale()
方法作用:
返回BigDecimal小数点后有几位数。
代码示例:
BigDecimal bdTest1 = new BigDecimal("200.555");
BigDecimal bdTest2 = new BigDecimal("-2.5");
BigDecimal bdTest3 = new BigDecimal("500");
System.out.println(bdTest1.scale());
System.out.println(bdTest2.scale());
System.out.println(bdTest3.scale());
代码结果图示:
precision
参数要求:
public int precision()
方法作用:
返回BigDecimal的精度
代码示例:
BigDecimal bdTest1 = new BigDecimal("200.555");
BigDecimal bdTest2 = new BigDecimal("-2.5");
BigDecimal bdTest3 = new BigDecimal("500");
System.out.println(bdTest1.precision());
System.out.println(bdTest2.precision());
System.out.println(bdTest3.precision());
代码结果图示:
unscaledValue
参数要求:
public BigInteger unscaledValue()
方法作用:
返回没有小数点的BigDecimal值
代码示例:
BigDecimal bdTest1 = new BigDecimal("200.555");
BigDecimal bdTest2 = new BigDecimal("-2.5");
BigDecimal bdTest3 = new BigDecimal("500");
System.out.println(bdTest1.unscaledValue());
System.out.println(bdTest2.unscaledValue());
System.out.println(bdTest3.unscaledValue());
代码结果图示:
round
参数要求:
public BigDecimal round(MathContext mc)
方法作用:
根据MathContext四舍五入
代码示例:
BigDecimal bdTest1 = new BigDecimal("200.555");
BigDecimal bdTest2 = new BigDecimal("-2.5");
BigDecimal bdTest3 = new BigDecimal("500");
System.out.println(bdTest1.round(new MathContext(3)));
System.out.println(bdTest2.round(new MathContext(2)));
System.out.println(bdTest3.round(new MathContext(1)));
代码结果图示:
setScale
参数要求:
public BigDecimal setScale(int newScale, RoundingMode roundingMode)
public BigDecimal setScale(int newScale)
方法作用:
为BigDecimal设定新的小数点后的位数
代码示例:
BigDecimal bdTest1 = new BigDecimal("200.555");
BigDecimal bdTest2 = new BigDecimal("-2.5");
BigDecimal bdTest3 = new BigDecimal("500");
System.out.println(bdTest1.setScale(2,RoundingMode.FLOOR));
System.out.println(bdTest2.setScale(2,RoundingMode.UP));
System.out.println(bdTest3.setScale(2));
代码结果图示:
注意不写RoundingMode的形式默认是UNNECESSARY模式,如果精度不对应会报错。
movePointLeft
参数要求:
public BigDecimal movePointLeft(int n)
方法作用:
让BigDecimal数字的小数点向左移动
代码示例:
BigDecimal bdTest1 = new BigDecimal("200.555");
BigDecimal bdTest2 = new BigDecimal("-2.5");
BigDecimal bdTest3 = new BigDecimal("500");
System.out.println(bdTest1.movePointLeft(2));
System.out.println(bdTest2.movePointLeft(2));
System.out.println(bdTest3.movePointLeft(2));
代码结果图示:
movePointRight
参数要求:
public BigDecimal movePointRight(int n)
方法作用:
让BigDecimal数字的小数点向右移
代码示例:
BigDecimal bdTest1 = new BigDecimal("200.555");
BigDecimal bdTest2 = new BigDecimal("-2.5");
BigDecimal bdTest3 = new BigDecimal("500");
System.out.println(bdTest1.movePointRight(2));
System.out.println(bdTest2.movePointRight(2));
System.out.println(bdTest3.movePointRight(2));
代码结果图示:
scaleByPowerOfTen
参数要求:
public BigDecimal scaleByPowerOfTen(int n)
方法作用:
为BigDecimal乘10的n次方
代码示例:
BigDecimal bdTest1 = new BigDecimal("200.555");
BigDecimal bdTest2 = new BigDecimal("-2.5");
BigDecimal bdTest3 = new BigDecimal("500");
System.out.println(bdTest1.scaleByPowerOfTen(2));
System.out.println(bdTest2.scaleByPowerOfTen(2));
System.out.println(bdTest3.scaleByPowerOfTen(2));
代码结果图示:
stripTrailingZeros
参数要求:
public BigDecimal stripTrailingZeros()
方法作用:
将数后面没用的0去掉
代码示例:
BigDecimal bdTest1 = new BigDecimal("200.55500");
BigDecimal bdTest2 = new BigDecimal("-2.500");
BigDecimal bdTest3 = new BigDecimal("500.00");
System.out.println(bdTest1.stripTrailingZeros());
System.out.println(bdTest2.stripTrailingZeros());
System.out.println(bdTest3.stripTrailingZeros());
代码结果图示:
compareTo
参数要求:
public int compareTo(BigDecimal val)
方法作用:
比较大小 大于为1 等于为0 小于为-1
代码示例:
BigDecimal bdTest1 = new BigDecimal("200");
BigDecimal bdTest2 = new BigDecimal("2");
BigDecimal bdTest3 = new BigDecimal("500");
System.out.println(bdTest1.compareTo(bdTest1));
System.out.println(bdTest1.compareTo(bdTest2));
System.out.println(bdTest1.compareTo(bdTest3));
代码结果图示:
equals
参数要求:
public boolean equals(Object x)
方法作用:
判断两个值是否相等,与compareTo不同
代码示例:
BigDecimal bdTest1 = new BigDecimal("200");
BigDecimal bdTest2 = new BigDecimal("2");
BigDecimal bdTest3 = new BigDecimal("2.00");
System.out.println(bdTest1.equals(bdTest1));
System.out.println(bdTest1.equals(bdTest2));
System.out.println(bdTest1.equals(bdTest3));
代码结果图示:
min
参数要求:
public BigDecimal min(BigDecimal val)
方法作用:
返回两个值中更小的那一个
代码示例:
BigDecimal bdTest1 = new BigDecimal("200");
BigDecimal bdTest2 = new BigDecimal("5");
BigDecimal bdTest3 = new BigDecimal("2.00");
System.out.println(bdTest1.min(bdTest1));
System.out.println(bdTest1.min(bdTest2));
System.out.println(bdTest1.min(bdTest3));
代码结果图示:
max
参数要求:
public BigDecimal max(BigDecimal val)
方法作用:
返回两个数中更大的那一个
代码示例:
BigDecimal bdTest1 = new BigDecimal("200");
BigDecimal bdTest2 = new BigDecimal("5");
BigDecimal bdTest3 = new BigDecimal("2.00");
System.out.println(bdTest1.max(bdTest1));
System.out.println(bdTest1.max(bdTest2));
System.out.println(bdTest1.max(bdTest3));
代码结果图示:
hashCode
参数要求:
public int hashCode()
方法作用:
返回BigDecimal的哈希码
代码示例:
BigDecimal bdTest1 = new BigDecimal("200");
BigDecimal bdTest2 = new BigDecimal("5");
BigDecimal bdTest3 = new BigDecimal("2.00");
System.out.println(bdTest1.hashCode());
System.out.println(bdTest2.hashCode());
System.out.println(bdTest3.hashCode());
代码结果图示:
toString
参数要求:
public String toString()
方法作用:
返回toString叙述的BigDecimal
代码示例:
BigDecimal bdTest1 = new BigDecimal("200");
BigDecimal bdTest2 = new BigDecimal("5");
BigDecimal bdTest3 = new BigDecimal("2.00");
System.out.println(bdTest1.toString());
System.out.println(bdTest2.toString());
System.out.println(bdTest3.toString());
代码结果图示:
toEngineeringString
参数要求:
public String toEngineeringString()
方法作用:
如果是科学计数法计数,则返回比精度多一位的计数。
代码示例:
BigDecimal bdTest1 = new BigDecimal("2e7");
BigDecimal bdTest2 = new BigDecimal("0.5e7");
BigDecimal bdTest3 = new BigDecimal("2.0E5");
System.out.println(bdTest1.toEngineeringString());
System.out.println(bdTest2.toEngineeringString());
System.out.println(bdTest3.toEngineeringString());
代码结果图示:
toPlainString
参数要求:
public String toPlainString()
方法作用:
返回String类型的BigDecimal数值
代码示例:
BigDecimal bdTest1 = new BigDecimal("200");
BigDecimal bdTest2 = new BigDecimal("5e7");
BigDecimal bdTest3 = new BigDecimal("-2.905");
System.out.println(bdTest1.toPlainString());
System.out.println(bdTest2.toPlainString());
System.out.println(bdTest3.toPlainString());
代码结果图示:
toBigInteger longValue intValue floatValue doubleValue
参数要求:
public BigInteger toBigInteger()
public long longValue()
public int intValue()
public float floatValue()
public double doubleValue()
方法作用:
将BigDecimal转换成对应的数据类型
代码示例:
BigDecimal bdTest1 = new BigDecimal("200");
BigInteger bi = bdTest1.toBigInteger();
long testL = bdTest1.longValue();
int testInt = bdTest1.intValue();
float testFloat = bdTest1.floatValue();
double testDouble = bdTest1.doubleValue();
System.out.println("bi = " + bi);
System.out.println("testL = " + testL);
System.out.println("testInt = " + testInt);
System.out.println("testFloat = " + testFloat);
System.out.println("testDouble = " + testDouble);
代码结果图示:
toBigIntegerExact longValueExact intValueExact shortValueExact byteValueExact
参数要求:
public BigInteger toBigIntegerExact()
public long longValueExact()
public int intValueExact()
public short shortValueExact()
public byte byteValueExact()
方法作用:
跟上面的差不多 但是结果超出类型范围或者损失数据会报错
代码示例:
BigDecimal bdTest1 = new BigDecimal("200");
BigInteger bi = bdTest1.toBigIntegerExact();
long testL = bdTest1.longValueExact();
int testInt = bdTest1.intValueExact();
short testShort = bdTest1.shortValueExact ();
byte testByte = bdTest1.byteValueExact();//250行
System.out.println("bi = " + bi);
System.out.println("testL = " + testL);
System.out.println("testInt = " + testInt);
System.out.println("testShort = " + testShort);
System.out.println("testByte = " + testByte);
代码结果图示:
代码:
BigDecimal bdTest1 = new BigDecimal("200");
BigInteger bi = bdTest1.toBigIntegerExact();
long testL = bdTest1.longValueExact();
int testInt = bdTest1.intValueExact();
short testShort = bdTest1.shortValueExact ();
//byte testByte = bdTest1.byteValueExact();//250行
System.out.println("bi = " + bi);
System.out.println("testL = " + testL);
System.out.println("testInt = " + testInt);
System.out.println("testShort = " + testShort);
图示:
ulp
参数要求:
public BigDecimal ulp()
方法作用:
返回对应精度的最小数字
代码示例:
BigDecimal bdTest1 = new BigDecimal("200");
BigDecimal bdTest2 = new BigDecimal("5e7");
BigDecimal bdTest3 = new BigDecimal("-2.905");
System.out.println(bdTest1.ulp());
System.out.println(bdTest2.ulp());
System.out.println(bdTest3.ulp());
代码结果图示:
最后
以上就是冷傲荔枝为你收集整理的Java BigDecimal的方法介绍的全部内容,希望文章能够帮你解决Java BigDecimal的方法介绍所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复