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

Double vs. BigDecimal?
EN

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

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

EN

回答 6

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用户

发布于 2015-04-14 16:18:56

double与double有两个主要区别:

  • 任意精度,类似于BigInteger,它们可以包含任意精度和大小的位数(而双精度数具有固定的位数)
  • 基数10而不是基数2,BigDecimal是n*10^-scale,其中n是任意大有符号整数,小数位数可以认为是将小数点向左或向右移动的位数

仍然不能说BigDecimal可以代表任何数字。但您应该使用BigDecimal进行货币计算的两个原因是:

  • 它可以表示可以用十进制表示的所有数字,并且几乎包括货币世界中的所有数字(您永远不会将1/3 $转移给某人)。
  • 可以控制精度以避免累积误差。对于double,随着值的大小增加,其精度会降低,这可能会给结果带来严重的误差。
票数 66
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3413448

复制
相关文章

相似问题

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