package cn.xbz;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class XBigDecimalDemo {
/** 默認的數據精度 , 採用比較常用的2位 */
private static final int DEF_SCALE = 2;
/** 正數樣本 */
private static final List<BigDecimal> BIG_DECIMAL_STREAM = Arrays.asList(
new BigDecimal("1.230"),
new BigDecimal("1.231"),
new BigDecimal("1.234"),
new BigDecimal("1.235"),
new BigDecimal("1.236"),
new BigDecimal("1.239"));
/** 負數樣本 */
private static final List<BigDecimal> _BIG_DECIMAL_STREAM = BIG_DECIMAL_STREAM.stream().map(BigDecimal.ZERO::subtract).collect(Collectors.toList());
public static void main(String[] args) throws Exception {
// ROUND_CEILING();//向上進位
// ROUND_FLOOR();//向下舍位
// ROUND_HALF_UP();//四捨五入
// ROUND_HALF_DOWN();//五舍六入
// ROUND_UP();//絕對值向上進位
// ROUND_DOWN();//絕對值向下舍位
ROUND_HALF_EVEN();//銀行家算法 四捨六入 五看前數 奇進偶舍
// ROUND_UNNECESSARY();//不捨位 , 精度位數小於小數位數會拋出異常
}
/**
* BigDecimal.ROUND_CEILING 向上進位 .
* 若當前精度位後一位數字不爲0 , 則向上進位
* 數字更大
*/
private static void ROUND_CEILING() {
BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > ROUND_CEILING > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_CEILING)));
System.out.println();
_BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > ROUND_CEILING > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_CEILING)));
}
/**
* BigDecimal.ROUND_FLOOR 向下舍位 .
* 若當前精度位後一位數字不爲0 , 則向下舍位
* 數字更小
*/
private static void ROUND_FLOOR() {
BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > ROUND_FLOOR > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_FLOOR)));
System.out.println();
_BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > ROUND_FLOOR > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_FLOOR)));
}
/**
* BigDecimal.ROUND_HALF_UP , 4舍5入 .
* 正數4舍5進 , 負數4舍5退(-1.234 -> -1.23 ; -1.235 -> -1.24)
*/
public static void ROUND_HALF_UP() {
BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > ROUND_HALF_UP > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_HALF_UP)));
System.out.println();
_BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > ROUND_HALF_UP > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_HALF_UP)));
}
/**
* BigDecimal.ROUND_HALF_DOWN , 5舍6入
* 正數5舍6進 , 負數5舍6退(-1.235 -> -1.23 ; -1.236 -> -1.24)
*/
public static void ROUND_HALF_DOWN() {
BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > ROUND_HALF_DOWN > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_HALF_DOWN)));
System.out.println();
_BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > ROUND_HALF_DOWN > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_HALF_DOWN)));
}
/**
* BigDecimal.ROUND_HALF_EVEN , 銀行家算法 . 4舍6入 , 5看前數 , 奇進偶舍
* 正數4舍6進 , 5看前一位數字 , 若爲奇數則進位 , 若爲偶數則舍位
* 負數5舍6退(-1.235 -> -1.23 ; -1.236 -> -1.24)
*/
public static void ROUND_HALF_EVEN() {
BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > ROUND_HALF_EVEN > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_HALF_EVEN)));
System.out.println();
_BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > ROUND_HALF_EVEN > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_HALF_EVEN)));
System.out.println();
BigDecimal bd = new BigDecimal("0.01");
BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal.add(bd) + " > ROUND_HALF_EVEN > " + bigDecimal.add(bd).setScale(DEF_SCALE, BigDecimal.ROUND_HALF_EVEN)));
System.out.println();
_BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal.add(bd) + " > ROUND_HALF_EVEN > " + bigDecimal.add(bd).setScale(DEF_SCALE, BigDecimal.ROUND_HALF_EVEN)));
}
/**
* BigDecimal.ROUND_UP , 絕對值向上進位 .
* 若當前精度位後一位數字不爲0 , 則絕對值向上進位
* 正數更大 , 負數更小
*/
public static void ROUND_UP() {
BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > ROUND_UP > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_UP)));
System.out.println();
_BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > ROUND_UP > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_UP)));
}
/**
* BigDecimal.ROUND_DOWN , 絕對值向下舍位 .
* 若當前精度位後一位數字不爲0 , 則絕對值向下舍位
* 正數更小 , 負數更大
*/
public static void ROUND_DOWN() {
BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > ROUND_DOWN > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_DOWN)));
System.out.println();
_BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > ROUND_DOWN > " + bigDecimal.setScale(DEF_SCALE, BigDecimal.ROUND_DOWN)));
}
/**
* BigDecimal.ROUND_UNNECESSARY , 不捨位 . 精度位數小於小數位數會拋出異常
*/
public static void ROUND_UNNECESSARY() {
BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(" " + bigDecimal + " > UNNECESSARY > " + bigDecimal.setScale(3, BigDecimal.ROUND_UNNECESSARY)));
System.out.println();
_BIG_DECIMAL_STREAM.forEach(bigDecimal -> System.out.println(bigDecimal + " > UNNECESSARY > " + bigDecimal.setScale(3, BigDecimal.ROUND_UNNECESSARY)));
}
}
BigDecimal的8種精度取捨方式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.