1. BigDecimal.ROUND_UP

翻译:舍入模式从零舍入。始终在丢弃非零小数之前递增数字。请注意,此舍入模式永远不会减小计算值的大小。

不论正负,保留精度之前的数字加一
0.123456789 保留四位小数结果为:0.1235
-0.123456789 保留四位小数结果为:-0.1235

  1. BigDecimal.ROUND_DOWN

翻译:舍入模式向零舍入。切勿在舍弃小数(即截断)之前增加数字。请注意,这种舍入模式永远不会增加计算值的大小。

不论正负,保留精度之后的数字直接截掉(丢弃)
0.123456789 保留四位小数结果为:0.1234
-0.123456789 保留四位小数结果为:-0.1234

  1. BigDecimal.ROUND_CEILING

翻译:舍入模式向正无穷大方向舍入。如果BigDecimal为正,则行为与ROUND_UP相同;如果为负,则表现为ROUND_DOWN。请注意,此舍入模式永远不会减少计算值。

正:ROUND_UP
负:ROUND_DOWN
0.123456789 保留四位小数结果为:0.1235
-0.123456789 保留四位小数结果为:-0.1234

  1. BigDecimal.ROUND_FLOOR

翻译:舍入模式向负无穷大舍入。如果BigDecimal为正,则行为与ROUND_DOWN相同;如果为负,则表现与ROUND_UP相同。请注意,此舍入模式永远不会增加计算值。

行为和BigDecimal.ROUND_CEILING相反
正:ROUND_DOWN
负:ROUND_UP
0.123456789 保留四位小数结果为:0.1234
-0.123456789 保留四位小数结果为:-0.1235

  1. BigDecimal.ROUND_HALF_UP

翻译:舍入模式向“最近的邻居”舍入,除非两个邻居都是等距的,在这种情况下将舍入。如果丢弃分数0.5,则表现为ROUND_UP;否则,行为与ROUND_DOWN相同。请注意,这是我们大多数人在小学时所教的四舍五入模式。

四舍五入,去掉正负再看
0.123456789 保留四位小数结果为:0.1235
-0.123456789 保留四位小数结果为:-0.1235

  1. BigDecimal.ROUND_HALF_DOWN

翻译:舍入模式向“最近的邻居”舍入,除非两个邻居都等距,在这种情况下舍入。如果丢弃的分数**>** 0.5,则行为与ROUND_UP相同;否则,行为与ROUND_DOWN相同。

0.123456789 保留四位小数结果为:0.1234
-0.123456789 保留四位小数结果为:-0.1234

  1. BigDecimal.ROUND_HALF_EVEN

翻译:舍入模式向“最近的邻居”舍入,除非两个邻居都等距,在这种情况下,向偶数邻居舍入。如果舍弃分数左边的数字为奇数,则表现为ROUND_HALF_UP;如果是偶数,则其行为与ROUND_HALF_DOWN相同。请注意,这是舍入模式,当在一系列计算中重复应用时,该模式可将累积误差最小化。

不论正负,精度前的一位是偶数直接截掉,是基数则加一
0.123456789 保留四位小数结果为:0.1234
-0.123456789 保留四位小数结果为:-0.1234
0.12335 保留五位小数结果为:0.1234
-0.12335 保留五位小数结果为:-0.1234

  1. BigDecimal.ROUND_UNNECESSARY

翻译:舍入模式可以断言所请求的操作具有准确的结果,因此不需要舍入。如果在产生不精确结果的操作上指定了这种舍入模式,则会引发ArithmeticException。

超过精度则报错
0.123456789保留4位小数则抛出异常

示例代码

import java.math.BigDecimal;

public class BigDecimalTest {

	public static void main(String[] args) {
		BigDecimal bigDecimal1 = new BigDecimal("0.12345");
		BigDecimal bigDecimal2 = new BigDecimal("-0.12345");

		System.out.println("******************* BigDecimal.ROUND_UP  ***********************");
		System.out.println(bigDecimal1.setScale(4, BigDecimal.ROUND_UP));
		System.out.println(bigDecimal2.setScale(4, BigDecimal.ROUND_UP));

		System.out.println("******************* BigDecimal.ROUND_DOWN  ***********************");
		System.out.println(bigDecimal1.setScale(4, BigDecimal.ROUND_DOWN));
		System.out.println(bigDecimal2.setScale(4, BigDecimal.ROUND_DOWN));

		System.out.println("******************* BigDecimal.ROUND_CEILING  ***********************");
		System.out.println(bigDecimal1.setScale(4, BigDecimal.ROUND_CEILING));
		System.out.println(bigDecimal2.setScale(4, BigDecimal.ROUND_CEILING));

		System.out.println("******************* BigDecimal.ROUND_FLOOR  ***********************");
		System.out.println(bigDecimal1.setScale(4, BigDecimal.ROUND_FLOOR));
		System.out.println(bigDecimal2.setScale(4, BigDecimal.ROUND_FLOOR));

		System.out.println("******************* BigDecimal.ROUND_HALF_UP  ***********************");
		System.out.println(bigDecimal1.setScale(4, BigDecimal.ROUND_HALF_UP));
		System.out.println(bigDecimal2.setScale(4, BigDecimal.ROUND_HALF_UP));

		System.out.println("******************* BigDecimal.ROUND_HALF_DOWN  ***********************");
		System.out.println(bigDecimal1.setScale(4, BigDecimal.ROUND_HALF_DOWN));
		System.out.println(bigDecimal2.setScale(4, BigDecimal.ROUND_HALF_DOWN));

		System.out.println("******************* BigDecimal.ROUND_HALF_EVEN  ***********************");
		System.out.println(bigDecimal1.setScale(4, BigDecimal.ROUND_HALF_EVEN));
		System.out.println(bigDecimal2.setScale(4, BigDecimal.ROUND_HALF_EVEN));
		System.out.println(new BigDecimal("0.12335").setScale(4, BigDecimal.ROUND_HALF_EVEN));
		System.out.println(new BigDecimal("0.12335").setScale(4, BigDecimal.ROUND_HALF_EVEN));

		System.out.println("******************* BigDecimal.ROUND_UNNECESSARY  ***********************");
		System.out.println(bigDecimal1.setScale(6, BigDecimal.ROUND_UNNECESSARY));
		System.out.println(bigDecimal2.setScale(3, BigDecimal.ROUND_UNNECESSARY));

	}

}

运行结果

******************* BigDecimal.ROUND_UP  ***********************
0.1235
-0.1235
******************* BigDecimal.ROUND_DOWN  ***********************
0.1234
-0.1234
******************* BigDecimal.ROUND_CEILING  ***********************
0.1235
-0.1234
******************* BigDecimal.ROUND_FLOOR  ***********************
0.1234
-0.1235
******************* BigDecimal.ROUND_HALF_UP  ***********************
0.1235
-0.1235
******************* BigDecimal.ROUND_HALF_DOWN  ***********************
0.1234
-0.1234
******************* BigDecimal.ROUND_HALF_EVEN  ***********************
0.1234
-0.1234
0.1234
0.1234
******************* BigDecimal.ROUND_UNNECESSARY  ***********************
0.123450
Exception in thread "main" java.lang.ArithmeticException: Rounding necessary
	at java.math.BigDecimal.commonNeedIncrement(BigDecimal.java:4179)
	at java.math.BigDecimal.needIncrement(BigDecimal.java:4235)
	at java.math.BigDecimal.divideAndRound(BigDecimal.java:4143)
	at java.math.BigDecimal.setScale(BigDecimal.java:2455)
	at com.demo.BigDecimalTest.main(BigDecimalTest.java:43)
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐