BigDecimal.setScale()方法用於商業計算的精度設置問題詳解

BigDecimal.setScale()方法用於商業計算的精度設置問題詳解


    網上的說法繁雜,看起來諸多不便,並且有的說法也不太準確,在這裏 做一下求證。用的較多的4個參數:
BigDecimal.ROUND_UP 這個方法做直接進位處理,但是有個特殊情況需要考慮,如果將要捨棄的位上的值是0,不做進位處理。
BigDecimal.ROUND_DOWN 這個方法做直接捨棄處理
BigDecimal.ROUND_HALF_UP 這個方法就是大名鼎鼎的四捨五入

BigDecimal.ROUND_HALF_DOWN 這個方法準確來說,是五舍六入


import java.math.BigDecimal;

/**
 * 
 * @author yangcq
 * Java常用商業計算工具類BigDecimal的精度設置方法setScale()詳解
 *
 */
public class BigDecimalTest {

	public static void main(String[] args) {
		bigDecimalTest();
	}

	private static void bigDecimalTest(){
		BigDecimal bigDecimal_01 = new BigDecimal("918.845"); 
		BigDecimal bigDecimal_02 = new BigDecimal("918.844");
		BigDecimal bigDecimal_03 = new BigDecimal("918.846"); 
		
		bigDecimal_01.setScale(3);
		bigDecimal_01.setScale(2,BigDecimal.ROUND_UP);
		bigDecimal_01.setScale(2,BigDecimal.ROUND_DOWN);
		bigDecimal_01.setScale(2,BigDecimal.ROUND_HALF_UP);
		bigDecimal_01.setScale(2,BigDecimal.ROUND_HALF_DOWN);
		
		System.out.println("測試數據:" + bigDecimal_01);
		System.out.println("BigDecimal.ROUND_UP = " + bigDecimal_01.setScale(2,BigDecimal.ROUND_UP));
		System.out.println("BigDecimal.ROUND_DOWN = " + bigDecimal_01.setScale(2,BigDecimal.ROUND_DOWN));
		System.out.println("BigDecimal.ROUND_HALF_UP = " + bigDecimal_01.setScale(2,BigDecimal.ROUND_HALF_UP));
		System.out.println("BigDecimal.ROUND_HALF_DOWN = " + bigDecimal_01.setScale(2,BigDecimal.ROUND_HALF_DOWN));
		
		System.out.println("測試數據:" + bigDecimal_02);
		System.out.println("BigDecimal.ROUND_UP = " + bigDecimal_02.setScale(2,BigDecimal.ROUND_UP));
		System.out.println("BigDecimal.ROUND_DOWN = " + bigDecimal_02.setScale(2,BigDecimal.ROUND_DOWN));
		System.out.println("BigDecimal.ROUND_HALF_UP = " + bigDecimal_02.setScale(2,BigDecimal.ROUND_HALF_UP));
		System.out.println("BigDecimal.ROUND_HALF_DOWN = " + bigDecimal_02.setScale(2,BigDecimal.ROUND_HALF_DOWN));
		
		System.out.println("測試數據:" + bigDecimal_03);
		System.out.println("BigDecimal.ROUND_UP = " + bigDecimal_03.setScale(2,BigDecimal.ROUND_UP));
		System.out.println("BigDecimal.ROUND_DOWN = " + bigDecimal_03.setScale(2,BigDecimal.ROUND_DOWN));
		System.out.println("BigDecimal.ROUND_HALF_UP = " + bigDecimal_03.setScale(2,BigDecimal.ROUND_HALF_UP));
		System.out.println("BigDecimal.ROUND_HALF_DOWN = " + bigDecimal_03.setScale(2,BigDecimal.ROUND_HALF_DOWN));
		
		// BigDecimal.ROUND_UP 這個方法做直接進位處理,但是有個特殊情況需要考慮,如果將要捨棄的位上的值是0,不做進位處理。
		BigDecimal bigDecimal_04 = new BigDecimal("918.850");
		System.out.println("測試數據:" + bigDecimal_04);
		System.out.println("BigDecimal.ROUND_UP = " + bigDecimal_04.setScale(2,BigDecimal.ROUND_UP));
		System.out.println("BigDecimal.ROUND_DOWN = " + bigDecimal_04.setScale(2,BigDecimal.ROUND_DOWN));
		System.out.println("BigDecimal.ROUND_HALF_UP = " + bigDecimal_04.setScale(2,BigDecimal.ROUND_HALF_UP));
		System.out.println("BigDecimal.ROUND_HALF_DOWN = " + bigDecimal_04.setScale(2,BigDecimal.ROUND_HALF_DOWN));
	}
}

-------------------------------------控制檯輸出:----------------------------------------------

測試數據:918.845
BigDecimal.ROUND_UP = 918.85
BigDecimal.ROUND_DOWN = 918.84
BigDecimal.ROUND_HALF_UP = 918.85
BigDecimal.ROUND_HALF_DOWN = 918.84
測試數據:918.844
BigDecimal.ROUND_UP = 918.85
BigDecimal.ROUND_DOWN = 918.84
BigDecimal.ROUND_HALF_UP = 918.84
BigDecimal.ROUND_HALF_DOWN = 918.84
測試數據:918.846
BigDecimal.ROUND_UP = 918.85
BigDecimal.ROUND_DOWN = 918.84
BigDecimal.ROUND_HALF_UP = 918.85
BigDecimal.ROUND_HALF_DOWN = 918.85
測試數據:918.850
BigDecimal.ROUND_UP = 918.85
BigDecimal.ROUND_DOWN = 918.85
BigDecimal.ROUND_HALF_UP = 918.85
BigDecimal.ROUND_HALF_DOWN = 918.85



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章