Java中數據格式化類DecimalFormat中八種舍入模式(Rounding Mode)
DecimalFormat用法:
double value = 11110.82;
//舍入模式
RoundingMode roundingMode = RoundingMode.HALF_UP;
DecimalFormat df = new DecimalFormat("###,###.0");
df.setRoundingMode(roundingMode);
String result = df.format(value);
System.out.println(result);
RoundingMode共有八種,分別如下:
1. UP與DOWN的區別
RoundingMode.UP: 向遠離零點方向舍入
RoundingMode.DOWN: 向零點方向舍入(截斷數字)
假設保留整數,例子如下:
UP | DOWN | |
---|---|---|
-1.5 | -2 | -1 |
-0.3 | -1 | 0 |
0 | 0 | 0 |
0.3 | 1 | 0 |
1.5 | 2 | 1 |
2. CEILING和FLOOR的區別
RoundingMode.CEILING: 向正無窮方法舍入
RoundingMode.FLOOR: 向負無窮方向舍入
假設保留整數,例子如下:
CEILING | FLOOR | |
---|---|---|
-1.5 | -1 | -2 |
-0.3 | 0 | -1 |
0 | 0 | 0 |
0.3 | 1 | 0 |
1.5 | 2 | 1 |
3. HALF_UP、HALF_DOWN和HALF_EVEN區別
假設要處理的那一位數字為n,
如果n大於5,則和RoundingMode.UP舍入方式一致,向遠離零點方向舍入
如果n小於5, 則和RoundingMode.DOWN舍入方式一致,向零點方向舍入。
如果n等於5,
RoundingMode.HALF_UP: 向遠離零點方向舍入;(通常意義上的四舍五入)
RoundingMode.HALF_DOWN: 向零點方向舍入;
RoundingMode.HALF_EVEN: 取最近兩個數中的偶數;
假設保留整數,例子如下:
HALF_UP | HALF_DOWN | HALF_EVEN | |
---|---|---|---|
-1.6 | -2 | -2 | -2 |
-1.5 | -2 | -1 | -2 |
-0.5 | -1 | 0 | 0 |
-0.3 | 0 | 0 | 0 |
0.3 | 0 | 0 | 0 |
0.5 | 1 | 0 | 0 |
1.5 | 2 | 1 | 2 |
1.6 | 2 | 2 | 2 |
附測試代碼:
public class Test {
public static void main(String[] args) throws Exception {
RoundingMode[] modes = {RoundingMode.HALF_UP, RoundingMode.HALF_DOWN, RoundingMode.HALF_EVEN};
double[] values = {-1.6, -1.5, -0.5, -0.3, 0.3, 0.5, 1.5, 1.6};
test(values, modes);
}
private static void test(double[] values, RoundingMode[] modes) {
for (double value : values) {
System.out.println();
for (RoundingMode mode : modes) {
System.out.print(fix(value, mode) + " ");
}
}
}
private static String fix(double value, RoundingMode mode) {
DecimalFormat df = new DecimalFormat("###,###");
df.setRoundingMode(mode);
return df.format(value);
}
}
4. UNNECESSARY作用
RoundingMode.UNNECESSARY: 只有當要處理的那一位數字為零時不拋出異常,並進行處理, 其他情況都會拋出異常。
假設保留整數,例子如下:
UNNECESSARY | |
---|---|
-1.2 | throw ArithmeticException |
-1.0 | -1 |
0 | 0 |
1.0 | 1 |
1.2 | throw ArithmeticException |
測試代碼如下:
import java.math.RoundingMode;
import java.text.DecimalFormat;
public class Test {
public static void main(String[] args) throws Exception {
RoundingMode[] modes = {RoundingMode.HALF_UP, RoundingMode.HALF_DOWN, RoundingMode.HALF_EVEN};
double[] values = {-1.6, -1.5, -0.5, -0.3, 0.3, 0.5, 1.5, 1.6};
test(values, modes);
}
private static void test(double[] values, RoundingMode[] modes) {
for (double value : values) {
System.out.println();
for (RoundingMode mode : modes) {
System.out.print(fix(value, mode) + " ");
}
}
}
private static String fix(double value, RoundingMode mode) {
DecimalFormat df = new DecimalFormat("###,###");
df.setRoundingMode(mode);
return df.format(value);
}
}