首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Double vs. BigDecimal?

Double vs. BigDecimal?
EN

Stack Overflow用户
提问于 2010-08-05 17:39:40
回答 5查看 370.3K关注 0票数 361

我必须计算一些浮点变量,我的同事建议我使用BigDecimal而不是double,因为它会更精确。但是我想知道它是什么,以及如何最大限度地利用BigDecimal

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-08-05 17:45:13

BigDecimal是一种精确的数字表示方式。Double具有一定的精度。使用不同幅度的倍增(例如d1=1000.0d2=0.001)可能会导致0.001在求和时一起下降,因为幅度的差异如此之大。如果使用BigDecimal,这种情况就不会发生。

BigDecimal的缺点是速度较慢,而且以这种方式编写算法会有点困难(因为+ - */没有过载)。

如果你和钱打交道,或者精确度是必须的,那就使用BigDecimal。否则,Doubles往往就足够好了。

我确实推荐阅读BigDecimaljavadoc,因为它们比我在这里更好地解释了事情:)

票数 523
EN

Stack Overflow用户

发布于 2016-05-14 03:10:19

我的英语不好,所以我在这里只写一个简单的例子。

代码语言:javascript
复制
double a = 0.02;
double b = 0.03;
double c = b - a;
System.out.println(c);

BigDecimal _a = new BigDecimal("0.02");
BigDecimal _b = new BigDecimal("0.03");
BigDecimal _c = _b.subtract(_a);
System.out.println(_c);

程序输出:

代码语言:javascript
复制
0.009999999999999998
0.01

还有人想用double吗?;)

票数 201
EN

Stack Overflow用户

发布于 2016-05-28 23:28:44

如果你写一个像1 / 7这样的小数值作为十进制值,你会得到

代码语言:javascript
复制
1/7 = 0.142857142857142857142857142857142857142857...

具有无限序列的142857。由于您只能写入有限数量的数字,因此不可避免地会引入舍入(或截断)错误。

1/101/100这样的用带小数部分的二进制数表示的数字在小数点后也有无限位数:

代码语言:javascript
复制
1/10 = binary 0.0001100110011001100110011001100110...

Doubles将值存储为二进制,因此可能仅通过将十进制数转换为二进制数而引入错误,甚至不进行任何算术。

另一方面,十进制数字(如BigDecimal)按原样存储每个十进制数字(二进制编码,但每个十进制数字都是独立的)。这意味着在一般意义上,decimal类型并不比二进制浮点或定点类型更精确(即,它无法在不损失精度的情况下存储1/7 ),但对于小数位数有限的数字来说,它更准确,这通常是货币计算的情况。

Java的BigDecimal有一个额外的优点,它可以在小数点两侧有任意(但有限的)位数,只受可用内存的限制。

票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3413448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档