java -- BigDecimal的setScale的几种用法
2016-06-22 13:22
579 查看
setScale对BigDecimal类型的数值进行精度的处理。
newScale 保留BigDecimal的位数。
roundingMode 有以下几种处理模式:
通过一个main方法诠释所有。go…
这里有一个需要注意,BigDecimal提供的构造方法中可以传入double类型的数值,这里需要注意的是double类型的数值并不精确。
比如
输出b:
参考
[http://esffor.iteye.com/blog/96157http://blog.csdn.net/wangjunjun2008/article/details/45559655
http://blog.csdn.net/lijunlinlijunlin/article/details/12218393
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
相关文章推荐
- 记录一个java.util.logging.Logger 使用中关于时间格式的问题
- Java之数组的拷贝
- 关于springMVC中AOP的问题
- Windows7配置JDK7环境
- Java输出希腊字母和大小写字母
- 我的后端开发书架2015 2.0版 (转)
- 定义抽象类的注意事项
- spring读取配置文件优化
- "Java消息回收机制"之源码+图文完全解析
- Java mail乱码
- Eclipse的Web Deployment Assembly
- eclipse里maven install时,报错提示jdk为无效的目标版本:1.7
- Java中 Thread和Runnable实现多线程的区别和联系
- 使用Spring 3的@value简化配置文件的读取
- 举例讲解Java的JSON类库GSON的基本用法
- 前言
- spring事务管理
- 华为机试---表达式合法判断
- Java的JSON格式转换库GSON的初步使用笔记
- Java输出空心菱形