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

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`BigDecimal.setScale` 是 Java 中用于对 BigDecimal 对象进行精度调整的方法。它可以将 BigDecimal 对象的小数位数和舍入模式调整为指定的值。 具体用法如下: ```java public BigDecimal setScale(int newScale, RoundingMode roundingMode) ``` 其中,`newScale` 是要设置的小数位数,`roundingMode` 是要使用的舍入模式。 舍入模式包括以下几种: - `RoundingMode.UP`:向绝对值最大的方向舍入。 - `RoundingMode.DOWN`:向零方向舍入。 - `RoundingMode.CEILING`:向正无穷方向舍入。 - `RoundingMode.FLOOR`:向负无穷方向舍入。 - `RoundingMode.HALF_UP`:四舍五入,向绝对值最接近的方向舍入。 - `RoundingMode.HALF_DOWN`:五舍六入,向绝对值最接近的方向舍入。 - `RoundingMode.HALF_EVEN`:银行家舍入法,如果保留位数后面的数字是 5,则向最接近的偶数舍入。 - `RoundingMode.UNNECESSARY`:如果对结果进行舍入,抛出 ArithmeticException。 例如,要将一个 BigDecimal 对象保留两位小数并向上舍入,可以使用以下代码: ```java BigDecimal num = new BigDecimal("3.14159"); BigDecimal result = num.setScale(2, RoundingMode.UP); ``` 其中,`num` 是要进行精度调整的 BigDecimal 对象,`2` 表示要保留两位小数,`RoundingMode.UP` 表示向上舍入。调用 `setScale` 方法后,会返回一个新的 BigDecimal 对象 `result`,它的小数位数为 2,值为 3.15。 需要注意的是,`setScale` 方法并不会改变原始的 BigDecimal 对象,而是返回一个新的对象。所以,如果要将结果保存到原始对象中,需要将返回值赋值给原始对象。例如: ```java BigDecimal num = new BigDecimal("3.14159"); num = num.setScale(2, RoundingMode.UP); // 将结果保存到原始对象中 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值