文档章节

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

之渊
 之渊
发布于 04/19 15:46
字数 262
阅读 52
收藏 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
博文 520
码字总数 154962
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

nignx的部署安装和反向代理

3、安装Nginx #yum update 更新一些库和必要的支持,完了之后去下载一个nginx的最新版,如今我责编的版本是1.7.7: #wget http://nginx.org/download/nginx-1.13.6.tar.gz 解压缩 #tar -zvxf n...

wangxujun59
26分钟前
2
0
将博客搬至CSDN

搬家

JackChenzp
31分钟前
2
0
lamba表达式

Java 8 lambda表达式示例 我个人对Java 8发布非常激动,尤其是lambda表达式和流API。越来越多的了解它们,我能写出更干净的代码。虽然一开始并不是这样。第一次看到用lambda表达式写出来的J...

os1cheng
32分钟前
2
0
jenkins: Opening Robot Framework log failed

6down vote Answer is explained at Jenkins issue tracking system: https://issues.jenkins-ci.org/browse/JENKINS-32118 For resolve your problem you must : Connect on your jenkins u......

关上越
41分钟前
1
0
CentOS7 ab压力测试安装与解释

原 CentOS7 ab压力测试安装与解释 2017年11月10日 18:43:25 moTzxx 阅读数:4889更多 个人分类: Centos7 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u0...

linjin200
43分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部