首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BigDecimal减法

BigDecimal减法
EN

Stack Overflow用户
提问于 2015-09-13 13:15:25
回答 2查看 17K关注 0票数 10

我想减去2个double值,并且我已经尝试了下面的代码。

代码语言:javascript
复制
double val1 = 2.0;
double val2 = 1.10;

System.out.println(val1 - val2);

我得到的输出结果是,

代码语言:javascript
复制
0.8999999999999999

为了获得作为0.9的输出,我尝试使用BigDecimal,如下所示:

代码语言:javascript
复制
BigDecimal val1BD = new BigDecimal(val1);
BigDecimal val2BD = new BigDecimal(val2);

System.out.println(val1BD.subtract(val2BD));

我得到的输出结果是,

代码语言:javascript
复制
0.899999999999999911182158029987476766109466552734375

然后我试着用BigDecimal.valueOf()

代码语言:javascript
复制
val1BD = BigDecimal.valueOf(val1);
val2BD = BigDecimal.valueOf(val2);

System.out.println(val1BD.subtract(val2BD));

最后,我得到了0.9格式的输出。

我的问题是,情况2和情况3之间的区别是什么?

在第二种情况下,为什么我会得到这样的输出?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-13 13:18:13

BigDecimal.valueOf(double d)使用规范的String表示为双精度值,内部使用Double.toString(double),这就是为什么在第二种情况下会得到0.9

注意:这通常是将双精度型(或浮点型)转换为BigDecimal的首选方法,因为返回的值等于从使用Double.toString(double)的结果构造BigDecimal时返回的值。

而对于new BigDecimal(0.9),它将值转换为double值的精确浮点表示,而不使用String表示,

将double转换为BigDecimal,这是double的二进制浮点值的精确十进制表示。

...

备注:

  1. 此构造函数的结果可能有些不可预测。

...

为例:

代码语言:javascript
复制
BigDecimal bd1 = new BigDecimal(Double.toString(0.9));
BigDecimal bd2 = new BigDecimal(0.9);
System.out.println(bd1);
System.out.println(bd2);

输出:

代码语言:javascript
复制
0.9
0.90000000000000002220446049250313080847263336181640625
票数 10
EN

Stack Overflow用户

发布于 2018-10-23 22:37:14

对于那些在这里寻找BigDecimal的其他问题(与上面的问题无关)的人来说……记住要给这些方法一个mathContext,以避免某些问题。

代码语言:javascript
复制
        MathContext mc = new MathContext(10, RoundingMode.HALF_UP);
        BigDecimal hitRate = new BigDecimal(totalGetValuesHitted).divide(new BigDecimal(totalGetValuesRequested), mc);
        BigDecimal missRate = new BigDecimal(1.0, mc).subtract(hitRate, mc);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32546553

复制
相关文章

相似问题

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