文档章节

java BigDecimal 的 setScale() 方法的 BigDecimal.ROUND_DOWN 舍入模式的BUG,坑

之渊
 之渊
发布于 04/19 15:46
字数 262
阅读 33
收藏 1

因为项目使用到 BigDecimal.ROUND_DOWN 接近零的舍入模式 ,没想到有一个 使用的坑。 下面来例子说明:

String add = "67.80";
		System.out.println(add.toString());
		BigDecimal t = new BigDecimal(Double.valueOf(add));
		System.out.println(t.toString());// 67.7999999999999971578290569595992565155029296875
		System.out.println(t.setScale(2, BigDecimal.ROUND_DOWN));// 67.79
		System.out.println(t.setScale(2, BigDecimal.ROUND_HALF_UP));// 67.80

可以看到 , 如果 BigDecimal 是由 double 来构造的,那么 使用 ROUND_DOWN 的时候,有时候会 发现 比实际的 值会小一点, 这就坑大了。 除非 是 值的小数点要比 直接 的小数位 多一些。 比如 String add = "67.802"; 这样的, 就可以。

如果是 使用 String 类型的就没有这样的问题。

String add = "67.80";
		System.out.println(add);
		BigDecimal t = new BigDecimal(add);
		System.out.println(t.toString());// 67.80
		System.out.println(t.setScale(2, BigDecimal.ROUND_DOWN));// 67.79
		System.out.println(t.setScale(2, BigDecimal.ROUND_HALF_UP));// 67.80

如果要避免的话 double , 可以使用 Double.toString() 方法来构造 BigDecimal

String add = "67.80";

		System.out.println(add.toString());
		BigDecimal t = new BigDecimal(Double.toString(new Double(add)));
		System.out.println(t.toString());// 67.80
		System.out.println(t.setScale(2, BigDecimal.ROUND_DOWN));// 67.80

总结

BigDecimal 的问题的,避免不了,只能说 使用其他方式了,记在心上。 因此 构造 BigDecimal 尽量不要使用 double 了。

© 著作权归作者所有

共有 人打赏支持
之渊
粉丝 11
博文 508
码字总数 150392
作品 0
佛山
程序员
java.math.BigDecimal记录

1.引言 借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精...

小鱼儿321
05/30
0
0
Java中BigDecimal的应用

我们来看一看java中BigDecimal的用法 public class MathUtil { // 加法 public static Double add(double a,double b,int scal) throws Exception{ BigDecimal add1 = conversionToBigDecima......

liangtee
2012/12/27
0
0
转:BigDecimal 使用方法详解

转贴:http://zhangyinhu8680.iteye.com/blog/1536397 BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该...

克温s
2016/05/13
78
0
BigDecimal的使用

这次在APP开发中我遇到了精确计算问题.比如服务器给我一个百分比,我根据这个比例计算出价格,送到服务器.比如:2100.05 * 0.2计算的结果并不是420.01,而是420.010000000005.在《Java解惑》这本...

SunnyTime
2016/03/23
275
0
在商业计算中我们要用java.math.BigDecimal

1.引言 2.BigDecimal简介 3.测试代码 3.1构造函数(主要测试参数类型为double和String的两个常用构造函数) 你认为输出结果会是什么呢?如果你没有认为第一个会输出1.22,那么恭喜你答对了,...

yiqifendou
2016/12/07
20
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

困扰当前数据中心管理的三大难题

导读 当企业发展到一定程度,或者之前的机房不能满足现在的数据中心使用时,企业会对数据中心进行迁移。那么在数据中心进行迁移的时候会遇到哪些风险呢?针对这些风险我们应该做出怎样的措施来...

问题终结者
14分钟前
0
0
设计模式:工厂方法模式(工厂模式)

工厂方法模式才是真正的工厂模式,前面讲到的静态工厂模式实际上不能说是一种真正意义上的设计模式,只是一种变成习惯。 工厂方法的类图: 这里面涉及到四个种类: 1、抽象产品: Product 2、...

京一
30分钟前
0
0
区块链和数据库,技术到底有何区别?

关于数据库和区块链,总会有很多的困惑。区块链其实是一种数据库,因为他是数字账本,并且在区块的数据结构上存储信息。数据库中存储信息的结构被称为表格。但是,区块链是数据库,数据库可不...

HiBlock
38分钟前
0
0
react native 开发碰到的问题

react-navigation v2 问题 问题: static navigationOptions = ({navigation, navigationOptions}) => ({ headerTitle: ( <Text style={{color:"#fff"}}>我的</Text> ), headerRight: ( <View......

罗培海
45分钟前
0
0
Mac Docker安装流程

久仰Docker大名已久,于是今天趁着有空,尝试了一下Docker 先是从docker的官网上下载下来mac版本的docker安装包,安装很简易,就直接拖图标就好了。 https://www.docker.com/products/docker...

writeademo
53分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部