Java 小數位進位

double d = 123.45;

如何將 d 取至小數第一位呢?

標準做法是使用 BigDecimal.setScale()

BigDecimal d2 = new BigDecimal(d).setScale(1, BigDecimal.ROUND_HALF_UP); // deprecated since version 9
BigDecimal d3 = new BigDecimal(d).setScale(1, RoundingMode.HALF_UP);

第一個參數是要取至的位數
第二個參數是捨入模式

RoundingMode.UP          //無條件進位
RoundingMode.DOWN        //無條件捨去
RoundingMode.CEILING     //無條件往上進位
RoundingMode.FLOOR       //無條件往下進位
RoundingMode.HALF_UP     //四捨五入
RoundingMode.HALF_DOWN   //五捨六入
RoundingMode.HALF_EVEN   //奇數則四捨五入,偶數則五捨六入
RoundingMode.UNNECESSARY //有小數會拋異常

最常搞混的是 UP、CEILING 與 DOWN、FLOOR

UP、DOWN 是判斷數字的大小
CEILING、FLOOR 是判斷數值的大小

正數的數字越大,數值越大
負數的數字越大,數值越小
所以差異只發生在負數的部分

mode範例說明
UP1.5 → 2
-1.5 → -2
不論正負,往數字大進位
CEILING1.5 → 2
-1.5 → -1
因為 -1 > -2
負數時反而變成捨去
DOWN1.5 → 1
-1.5 → -1
不論正負,往數字小捨去
FLOOR1.5 → 1
-1.5 → -2
因為 -1 > -2
負數時反而變成進位

其他方法

利用型別轉換的精度遺失
結果相當於 RoundingMode.DOWN

double d4 = (int) (d * 10) / 10.0;

利用轉為字串的格式

String s = new DecimalFormat(".0").format(d);