setScale对BigDecimal类型的数值进行精度的处理。
public BigDecimal setScale(int newScale, int roundingMode) {
...
}
- newScale 保留BigDecimal的位数。
- roundingMode 有以下几种处理模式:
public final static int ROUND_UP = 0;
public final static int ROUND_DOWN = 1;
public final static int ROUND_CEILING = 2;
public final static int ROUND_FLOOR = 3;
public final static int ROUND_HALF_UP = 4;
public final static int ROUND_HALF_DOWN = 5;
public final static int ROUND_HALF_EVEN = 6;
public final static int ROUND_UNNECESSARY = 7;
通过一个main方法诠释所有。go…
package com.redhorse.util;
import java.math.BigDecimal;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 为避免金额计算精度丢失,将double类型转换为BigDecimal再进行相关计算
*
* @author kang
*
*/
public class BigDecimalUtils {
/**
* 向上进位
*
* @author: Gao Peng
* @date: 2016年6月21日 下午3:06:55
* @param: @param
* newScale
* @param: @param
* b
* @param: @return
* @return: BigDecimal
*/
public static BigDecimal setScaleRoundUp(int newScale, BigDecimal b) {
return b.setScale(newScale, BigDecimal.ROUND_UP);
}
/**
*
* @author: Gao Peng
* @date: 2016年6月21日 下午5:18:41
* @param: @param
* newScale
* @param: @param
* b
* @param: @return
* @return: BigDecimal
*/
public static BigDecimal setScaleRoundDown(int newScale, BigDecimal b) {
return b.setScale(newScale, BigDecimal.ROUND_DOWN);
}
/**
*
* @author: Gao Peng
* @date: 2016年6月21日 下午5:18:44
* @param: @param
* newScale
* @param: @param
* b
* @param: @return
* @return: BigDecimal
*/
public static BigDecimal setScaleRoundCeiling(int newScale, BigDecimal b) {
return b.setScale(newScale, BigDecimal.ROUND_CEILING);
}
/**
*
* @author: Gao Peng
* @date: 2016年6月21日 下午5:18:47
* @param: @param
* newScale
* @param: @param
* b
* @param: @return
* @return: BigDecimal
*/
public static BigDecimal setScaleRoundFloor(int newScale, BigDecimal b) {
return b.setScale(newScale, BigDecimal.ROUND_FLOOR);
}
/**
*
* @author: Gao Peng
* @date: 2016年6月21日 下午5:18:50
* @param: @param
* newScale
* @param: @param
* b
* @param: @return
* @return: BigDecimal
*/
public static BigDecimal setScaleRoundHalfUp(int newScale, BigDecimal b) {
return b.setScale(newScale, BigDecimal.ROUND_HALF_UP);
}
/**
*
* @author: Gao Peng
* @date: 2016年6月21日 下午5:18:53
* @param: @param
* newScale
* @param: @param
* b
* @param: @return
* @return: BigDecimal
*/
public static BigDecimal setScaleRoundHalfDown(int newScale, BigDecimal b) {
return b.setScale(newScale, BigDecimal.ROUND_HALF_DOWN);
}
/**
*
* @author: Gao Peng
* @date: 2016年6月21日 下午5:18:56
* @param: @param
* newScale
* @param: @param
* b
* @param: @return
* @return: BigDecimal
*/
public static BigDecimal setScaleRoundHalfEven(int newScale, BigDecimal b) {
return b.setScale(newScale, BigDecimal.ROUND_HALF_EVEN);
}
/**
*
* @author: Gao Peng
* @date: 2016年6月21日 下午5:18:59
* @param: @param
* newScale
* @param: @param
* b
* @param: @return
* @return: BigDecimal
*/
public static BigDecimal setScaleRoundUnnecessary(int newScale, BigDecimal b) {
return b.setScale(newScale, BigDecimal.ROUND_UNNECESSARY);
}
public static void main(String[] args) {
BigDecimal b = new BigDecimal("1.251");
System.out.println("执行数值:" + b.toString());
// 如果b为正数,则进行RoundUp操作,否则,RoundDown操作
System.out.println("setScaleRoundCeiling:" + setScaleRoundCeiling(1, b));
// 如果b为正数,则进行RoundDown操作,否则,RoundUp操作
System.out.println("setScaleRoundFloor:" + setScaleRoundFloor(1, b));
// 进位
System.out.println("setScaleRoundUp:" + setScaleRoundUp(1, b));
// 截位
System.out.println("setScaleRoundDown:" + setScaleRoundDown(1, b));
// 四舍五入,截取小数 > .5 进位
System.out.println("setScaleRoundHalfDown:" + setScaleRoundHalfDown(2, b));
// 四舍五入,截取小数 >= .5 进位
System.out.println("setScaleRoundHalfUp:" + setScaleRoundHalfUp(2, b));
// 如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP ;如果它为偶数,则作 ROUND_HALF_DOWN 。
// 奇数/偶数根据舍弃位数后,数值的最后一位判断,比如4.123,保留1位,为4.1,则1是奇数
System.out.println("setScaleRoundHalfEven:" + setScaleRoundHalfEven(1, b));
// 该“伪舍入模式”实际是指明所要求的操作必须是精确的,,因此不需要舍入操作。
System.out.println("setScaleRoundUnnecessary:" + setScaleRoundUnnecessary(3, b));
}
}
这里有一个需要注意,BigDecimal提供的构造方法中可以传入double类型的数值,这里需要注意的是double类型的数值并不精确。
比如BigDecimal b = new BigDecimal(1.251);
输出b:1.250999999999999889865875957184471189975738525390625
参考
[http://esffor.iteye.com/blog/96157http://blog.youkuaiyun.com/wangjunjun2008/article/details/45559655
http://blog.youkuaiyun.com/lijunlinlijunlin/article/details/12218393