java -- BigDecimal的setScale的几种用法

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.csdn.net/wangjunjun2008/article/details/45559655
http://blog.csdn.net/lijunlinlijunlin/article/details/12218393

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值