BigDecimal的八种舍入模式

  • 2021年10月29日
  • Java

/**
 * 说明:
 * @author me@longlonggo.com
 *
 */
public class MyTest {

	public static void main(String[] args) {
		BigDecimal testNum1 = new BigDecimal("12.3405");
		BigDecimal testNum2 = new BigDecimal("-12.3405");
		BigDecimal testNum5 = new BigDecimal("1.2555");
		BigDecimal testNum6 = new BigDecimal("-1.2555");
		
		// 舍入模式ROUND_UP,保留两位小数(此舍入模式始终不会减少计算值的大小)
		// 不管正负,保留位数字+1(0除外)
		System.out.println("----ROUND_UP:【" + testNum1 + " → "  + testNum1.setScale(2,BigDecimal.ROUND_UP)+"】");
		System.out.println("----ROUND_UP:【" + testNum2 + " → "  + testNum2.setScale(2,BigDecimal.ROUND_UP)+"】n");
		
		// 舍入模式ROUND_DOWN,保留两位小数(此舍入模式始终不会增加计算值的大小)
		// 不管正负,保留位后全部舍去
		System.out.println("----ROUND_DOWN:【" + testNum1 + " → "  + testNum1.setScale(2,BigDecimal.ROUND_DOWN)+"】");
		System.out.println("----ROUND_DOWN:【" + testNum2 + " → "  + testNum2.setScale(2,BigDecimal.ROUND_DOWN)+"】n");
		
		// 舍入模式ROUND_CEILING,保留两位小数(此舍入模式始终不会减少计算值。)
		// 正数时,保留数位后如果有值,则保留位+1
		// 负数时,保留位后全部舍去,保留位值不变
		System.out.println("----ROUND_CEILING:【" + testNum1 + " → " + testNum1.setScale(2,BigDecimal.ROUND_CEILING)+"】");
		System.out.println("----ROUND_CEILING:【" + testNum2 + " → "  + testNum2.setScale(2,BigDecimal.ROUND_CEILING)+"】n");

		// 舍入模式ROUND_FLOOR,保留两位小数(此舍入模式始终不会增加计算值)
		// 正数时,保留位后全部舍去
		// 负数时,保留位数字+1(0除外,符号为负)
		System.out.println("----ROUND_FLOOR:【" + testNum1 + " → "  + testNum1.setScale(2,BigDecimal.ROUND_FLOOR)+"】");
		System.out.println("----ROUND_FLOOR:【" + testNum2 + " → "  + testNum2.setScale(2,BigDecimal.ROUND_FLOOR)+"】n");
		
		// 舍入模式ROUND_HALF_UP,保留两位小数(传统型四舍五入)
		// 不管正负,如果舍弃位数字>=5,则保留数位最后一位数字+1,否则保留位后全部舍去
		System.out.println("----ROUND_HALF_UP:【" + testNum1 + " → "  + testNum1.setScale(2,BigDecimal.ROUND_HALF_UP)+"】");
		System.out.println("----ROUND_HALF_UP:【" + testNum5 + " → "  + testNum5.setScale(2,BigDecimal.ROUND_HALF_UP)+"】");
		System.out.println("----ROUND_HALF_UP:【" + testNum2 + " → "  + testNum2.setScale(2,BigDecimal.ROUND_HALF_UP)+"】");
		System.out.println("----ROUND_HALF_UP:【" + testNum6 + " → "  + testNum6.setScale(2,BigDecimal.ROUND_HALF_UP)+"】n");
		

		// 舍入模式ROUND_HALF_DOWN,保留两位小数(五舍六入)
		// 该舍入方式本人有疑问,待修正
		System.out.println("----ROUND_HALF_DOWN:【" + testNum1 + " → "  + testNum1.setScale(2,BigDecimal.ROUND_HALF_DOWN)+"】");
		System.out.println("----ROUND_HALF_DOWN:【" + testNum5 + " → "  + testNum5.setScale(2,BigDecimal.ROUND_HALF_DOWN)+"】");
		System.out.println("----ROUND_HALF_DOWN:【" + testNum2 + " → "  + testNum2.setScale(2,BigDecimal.ROUND_HALF_DOWN)+"】");
		System.out.println("----ROUND_HALF_DOWN:【" + testNum6 + " → "  + testNum6.setScale(2,BigDecimal.ROUND_HALF_DOWN)+"】n");

		// 舍入模式ROUND_HALF_EVEN,保留两位小数(银行家舍入法)
		// 该舍入方式本人有疑问,待修正
		System.out.println("----ROUND_HALF_EVEN:【" + testNum2 + " → "  + testNum2.setScale(2,BigDecimal.ROUND_HALF_EVEN)+"】");
		System.out.println("----ROUND_HALF_EVEN:【" + testNum6 + " → "  + testNum6.setScale(2,BigDecimal.ROUND_HALF_EVEN)+"】n");

		// 舍入模式ROUND_UNNECESSARY,精确的结果,因此不需要舍入,舍入报错(精确的结果)
		// 该舍入方式本人有疑问,待修正
		System.out.println("----ROUND_UNNECESSARY:【" + testNum1 + " → "  + testNum1.setScale(BigDecimal.ROUND_UNNECESSARY)+"】");
		System.out.println("----ROUND_UNNECESSARY:【" + testNum2 + " → "  + testNum2.setScale(BigDecimal.ROUND_UNNECESSARY)+"】n");
	}

}
取值结果
----ROUND_UP:【12.3405 → 12.35】
----ROUND_UP:【-12.3405 → -12.35】

----ROUND_DOWN:【12.3405 → 12.34】
----ROUND_DOWN:【-12.3405 → -12.34】

----ROUND_CEILING:【12.3405 → 12.35】
----ROUND_CEILING:【-12.3405 → -12.34】

----ROUND_FLOOR:【12.3405 → 12.34】
----ROUND_FLOOR:【-12.3405 → -12.35】

----ROUND_HALF_UP:【12.3405 → 12.34】
----ROUND_HALF_UP:【1.2555 → 1.26】
----ROUND_HALF_UP:【-12.3405 → -12.34】
----ROUND_HALF_UP:【-1.2555 → -1.26】

----ROUND_HALF_DOWN:【12.3405 → 12.34】
----ROUND_HALF_DOWN:【1.2555 → 1.26】
----ROUND_HALF_DOWN:【-12.3405 → -12.34】
----ROUND_HALF_DOWN:【-1.2555 → -1.26】

----ROUND_HALF_EVEN:【-12.3405 → -12.34】
----ROUND_HALF_EVEN:【-1.2555 → -1.26】

----ROUND_UNNECESSARY:【12.3405 → 12.3405000】
----ROUND_UNNECESSARY:【-12.3405 → -12.3405000】

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注