本文主要讲解BigDecimal的比较运算,保留精度和取整和基础运算,BigDecimal与其他数据类型转换。
文章目录
- 比较运算
- 保留精度及取整
- 取整(保留0位小数)
- 保留精度
- 基础运算
- BigDecimal与其他数据类型转换
比较运算
比较num1是否大于num2
public static boolean gt(@NotNull BigDecimal num1, BigDecimal num2) {
return num1.compareTo(num2) > 0;
}
比较num1是否小于num2
public static boolean lt(@NotNull BigDecimal num1, BigDecimal num2) {
return num1.compareTo(num2) < 0;
}
比较num1是否大于等于num2
public static boolean ge(@NotNull BigDecimal num1, BigDecimal num2) {
return num1.compareTo(num2) >= 0;
}
比较num1是否小于等于num2
public static boolean le(@NotNull BigDecimal num1, BigDecimal num2) {
return num1.compareTo(num2) <= 0;
}
比较num1是否等于num2
public static boolean eq(@NotNull BigDecimal num1, BigDecimal num2) {
return num1.compareTo(num2) == 0;
}
保留精度及取整
核心主要是 setScale(int newScale, int roundingMode)
方法。
主要是两个参数:
-
newScale
为小数位数; -
roundingMode
为取舍模式;
取整(保留0位小数)
/**
* 取整返回int 类型
* @param num1
* @param roundingMode
* @return
*/
public static int intValue(@NotNull BigDecimal num1,int roundingMode) {
return num1.setScale(SCALA_ZERO, roundingMode).intValue();
}
取整时setScale(int newScale, int roundingMode)
第一个参数为0,第二个为取舍模式。
各个roundingMode详解如下:
-
ROUND_UP
:正数时,舍弃小数后(整数部分)加1,比如100.39结果为100。负数时,舍弃小数后(整数部分)减去1,-100.39结果为 -101。 -
ROUND_DOWN
:直接舍弃小数。 -
ROUND_CEILING
:如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作 (取附近较大的整数)。 -
ROUND_FLOOR
: 如果 BigDecimal 是正的,则做 ROUND_DOWN 操作;如果为负,则做 ROUND_UP 操作(取附近较小的整数)。 -
ROUND_HALF_UP
:四舍五入(取更近的整数)。 -
ROUND_HALF_DOWN
:同ROUND_HALF_UP 差别仅在于0.5时会向下取整。 -
ROUND_HALF_EVEN
:取最近的偶数。 -
ROUND_UNNECESSARY
:不需要取整,如果存在小数位,就抛ArithmeticException 异常。
保留精度
四舍五入保留几位小数
/**
* 四舍五入保留几位小数
* @param scala 保留几位
* @param num1 对应数值
* @return
*/
public static float halfUpValue(@NotNull BigDecimal num1,int scala) {
return num1.setScale(scala, BigDecimal.ROUND_HALF_UP).floatValue();
}
指定取舍规则,保留几位小数
/**
* 指定取舍规则,保留几位小数
* @param scala 保留几位
* @param num1 对应数值
* @param roundingMode 取舍规则
* @return
*/
public static BigDecimal roundingModeValue(@NotNull BigDecimal num1,int scala,int roundingMode) {
/**
* setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
* setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
* setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
* setScale(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
*/
return num1.setScale(scala, roundingMode);
}
基础运算
主要是以下方法:
加:BigDecimal add(BigDecimal augend)
减:BigDecimal subtract(BigDecimal subtrahend)
乘:BigDecimal multiply(BigDecimal multiplicand)
除:BigDecimal divide(BigDecimal divisor)
取余:BigDecimal[] divideAndRemainder(BigDecimal divisor)
,返回一个BigDecimal数组,返回数组中包含两个元素,第一个元素为两数相除的商,第二个元素为余数。
BigDecimal与其他数据类型转换
四舍五入保留几位小数返回字符串
/**
* 四舍五入保留几位小数返回字符串
* @param tScala 保留几位
* @param num1 对应数值
* @param tRoundingMode 舍入类型
* @return
*/
public static String toPlainString(@NotNull BigDecimal num1, int tScala, int tRoundingMode) {
return num1.setScale(tScala, tRoundingMode).toPlainString();
}
四舍五入保留两位小数返回double类型
/**
* 四舍五入保留两位小数返回double类型
* @param num1
* @return
*/
public static double doubleValue(@NotNull BigDecimal num1) {
return num1.setScale(SCALA_TWO, BigDecimal.ROUND_HALF_UP).doubleValue();
}
其他转换类似:floatValue()、 longValue() 、intValue()…。