简介
- BigDecimal为不可变、任意精度的有符号十进制数。值
unscaledValue * 10-scale
,其中unscaledValue(非标度值)为任意精度整数,scale(标度)为32位整型(可负)。 - 计算器要求20位精确度且支持超大数,double类型(最多支持16位有效数字且最大值仅支持10^308次方)不够用,可用BigDecimal承载数据进行运算。
- BigDecimal支持任意精度和长度浮点数运算,运算时最好设各操作数小数精确度。特别除法需设保留几位小数,没设小数精确度则结果精确度等同操作数中最低精确度致结果不正确。
资料
BigDecimal类(高精度小数)
java.math.MathContext
舍入模式
舍入模式
BigDecimal.ROUND_DOWN
直省多余小数(1.28保留1位小数即1.2)
BigDecimal.ROUND_UP
直接进位(1.21保留1位小数即1.3)
BigDecimal.ROUND_HALF_DOWN
四舍五入(2.35保留1位即2.3)
BigDecimal.ROUND_HALF_UP
四舍五入(2.35保留1位即2.4)
方法
加
add(BigDecima)
减
subtract(BigDecimal)
乘
multiply(BigDecimal)
除
divide(BigDecimal)
乘方
pow(BigDecimal)
绝对值
abs()
取反
negate()
对比
compareTo(BigDecimal)
小数点精确度
setScale(int)
转String
BigDecimalToString
package util;
import java.math.BigDecimal;
import java.text.DecimalFormat;
/**
* Created on 2019/3/11.
*
* @author 郑少鹏
* @desc BigDecimalToString
*/
class BigDecimalToString {
private static final String EXPR_PATTERN = "0.##########E0";
private static final String PATTERN = "0.##########";
private static final String INTEGER_MIN_VALUE_CHANGE_TO_EXPR = "10000000";
private static final String DECIMAL_MIN_VALUE_CHANGE_TO_EXPR = "0.0001";
/**
* Judging number is able to convert to expr display or not.
*
* @param bigDecimal BigDecimal
* @return boolean
*/
private static boolean bigDecimalCanConvertToString(BigDecimal bigDecimal) {
if (bigDecimal == null) {
return false;
}
boolean result = false;
BigDecimal absDB = bigDecimal.abs();
if ((absDB.compareTo(new BigDecimal(DECIMAL_MIN_VALUE_CHANGE_TO_EXPR)) <= 0) || (absDB.compareTo(new BigDecimal(INTEGER_MIN_VALUE_CHANGE_TO_EXPR)) >= 0)) {
result = true;
}
if (absDB.compareTo(new BigDecimal(0)) == 0) {
result = false;
}
return result;
}
/**
* BigDecimal to String.
*
* @param bigDecimal BigDecimal
* @return String
*/
static String bigDecimalToString(BigDecimal bigDecimal) {
if (bigDecimal == null) {
return null;
}
DecimalFormat df = new DecimalFormat();
if (bigDecimalCanConvertToString(bigDecimal)) {
df.applyPattern(EXPR_PATTERN);
} else {
df.applyPattern(PATTERN);
}
return df.format(bigDecimal);
}
}
Double转String
其它
说明
BigDecimal无sin、cos、log等函数。
解决
通Jar包BigMath解决。
/**
* 精度
*/
private PrecisionHolder precision = new PrecisionHolder() {
@Override
public int getPrecision() {
return 6;
}
};
private BigMath bigMath = BigMath.getDefaultBigMath(precision);
BigDecimal a = bigMath.pow(v2, BigDecimal.valueOf(1.8));