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 | 範例 | 說明 |
---|---|---|
UP | 1.5 → 2 -1.5 → -2 | 不論正負,往數字大進位 |
CEILING | 1.5 → 2 -1.5 → -1 | 因為 -1 > -2 負數時反而變成捨去 |
DOWN | 1.5 → 1 -1.5 → -1 | 不論正負,往數字小捨去 |
FLOOR | 1.5 → 1 -1.5 → -2 | 因為 -1 > -2 負數時反而變成進位 |
其他方法
利用型別轉換的精度遺失
結果相當於 RoundingMode.DOWN
double d4 = (int) (d * 10) / 10.0;
利用轉為字串的格式
String s = new DecimalFormat(".0").format(d);