Java BigDecimal 的舍入模式(RoundingMode)详解
RoundingMode
是 Java 中用于定义舍入行为的枚举类。它主要用于精确的数字运算,尤其是涉及到小数点的情况下。以下是 RoundingMode
的详细讲解及举例说明:
RoundingMode
常见枚举值
1、UP
-
向远离零的方向舍入。
-
例如:
1.1
会舍入为2
,-1.1
会舍入为-2
。
2、DOWN
-
向接近零的方向舍入。
-
例如:
1.9
会舍入为1
,-1.9
会舍入为-1
。
3、CEILING
-
向正无穷方向舍入。
-
例如:
1.1
会舍入为2
,-1.1
会舍入为-1
。
4、FLOOR
-
向负无穷方向舍入。
-
例如:
1.9
会舍入为1
,-1.9
会舍入为-2
。
5、HALF_UP
-
向最接近的数字舍入,如果距离相等,则向远离零的方向舍入,即四舍五入。
-
例如:
1.5
会舍入为2
,-1.5
会舍入为-2
。
6、HALF_DOWN
-
向最接近的数字舍入,如果距离相等,则向接近零的方向舍入。
-
例如:
1.5
会舍入为1
,-1.5
会舍入为-1
。
7、HALF_EVEN
-
向最接近的数字舍入,如果距离相等,则向偶数方向舍入(银行家舍入法)。
-
例如:
1.5
会舍入为2
,2.5
会舍入为2
。
8、UNNECESSARY
-
不允许舍入(如果舍入是必要的,则抛出
ArithmeticException
)。
使用示例
下面通过示例来演示如何在 BigDecimal
中使用不同的 RoundingMode
:
import java.math.BigDecimal;
import java.math.RoundingMode;
public class RoundingModeExample {
public static void main(String[] args) {
BigDecimal value1 = new BigDecimal("2.5");
BigDecimal value2 = new BigDecimal("1.1");
BigDecimal value3 = new BigDecimal("-1.1");
System.out.println("Original value: " + value1); // Original value: 2.5
System.out.println("UP: " + value1.setScale(0, RoundingMode.UP)); // UP: 3
System.out.println("DOWN: " + value1.setScale(0, RoundingMode.DOWN)); // DOWN: 2
System.out.println("CEILING: " + value1.setScale(0, RoundingMode.CEILING)); // CEILING: 3
System.out.println("FLOOR: " + value1.setScale(0, RoundingMode.FLOOR)); // FLOOR: 2
System.out.println("HALF_UP: " + value1.setScale(0, RoundingMode.HALF_UP)); // HALF_UP: 3
System.out.println("HALF_DOWN: " + value1.setScale(0, RoundingMode.HALF_DOWN)); // HALF_DOWN: 2
System.out.println("HALF_EVEN: " + value1.setScale(0, RoundingMode.HALF_EVEN)); // HALF_EVEN: 2
System.out.println("Original value: " + value2); // Original value: 1.1
System.out.println("UP: " + value2.setScale(0, RoundingMode.UP)); // UP: 2
System.out.println("DOWN: " + value2.setScale(0, RoundingMode.DOWN)); // DOWN: 1
System.out.println("CEILING: " + value2.setScale(0, RoundingMode.CEILING)); // CEILING: 2
System.out.println("FLOOR: " + value2.setScale(0, RoundingMode.FLOOR)); // FLOOR: 1
System.out.println("HALF_UP: " + value2.setScale(0, RoundingMode.HALF_UP)); // HALF_UP: 1
System.out.println("HALF_DOWN: " + value2.setScale(0, RoundingMode.HALF_DOWN)); // HALF_DOWN: 1
System.out.println("HALF_EVEN: " + value2.setScale(0, RoundingMode.HALF_EVEN)); // HALF_EVEN: 1
System.out.println("Original value: " + value3); // Original value: -1.1
System.out.println("UP: " + value3.setScale(0, RoundingMode.UP)); // UP: -2
System.out.println("DOWN: " + value3.setScale(0, RoundingMode.DOWN)); // DOWN: -1
System.out.println("CEILING: " + value3.setScale(0, RoundingMode.CEILING)); // CEILING: -1
System.out.println("FLOOR: " + value3.setScale(0, RoundingMode.FLOOR)); // FLOOR: -2
System.out.println("HALF_UP: " + value3.setScale(0, RoundingMode.HALF_UP)); // HALF_UP: -1
System.out.println("HALF_DOWN: " + value3.setScale(0, RoundingMode.HALF_DOWN)); // HALF_DOWN: -1
System.out.println("HALF_EVEN: " + value3.setScale(0, RoundingMode.HALF_EVEN)); // HALF_EVEN: -1
}
}
总结
-
UP 和 CEILING 类似,但 CEILING 针对正数和负数的结果不同。
-
DOWN 和 FLOOR 类似,但 FLOOR 针对正数和负数的结果不同。
-
HALF_UP、HALF_DOWN 和 HALF_EVEN 都是四舍五入策略,区别在于如何处理刚好在中间的情况(如 0.5)。
选择适当的 RoundingMode
可以确保在金融计算、统计分析等领域的结果精确且符合业务需求。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 楠笙
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果
音乐天地