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

BigDecimal乘法
EN

Stack Overflow用户
提问于 2015-04-27 15:04:25
回答 2查看 3.2K关注 0票数 5

我尝试用BigDecimal方法乘两个multiply值,如下所示,

代码语言:javascript
复制
BigDecimal dur = BigDecimal.valueOf(60/1.1);
BigDecimal bal = BigDecimal.valueOf(1.1);

BigDecimal ans  = dur.multiply(bal);

System.out.println("Ans:"+ans);

我把人排除在60之外。但我得到的是,

代码语言:javascript
复制
Ans:59.999999999999994

为什么会这样,我们如何解决这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-27 15:19:35

问题是,您有一个不能用double表示的值,但也不能用BigDecimal表示,所以您必须应用合理的四舍五入来获得预期的解决方案。

代码语言:javascript
复制
double d = 60 / 1.1 * 1.1;
System.out.println("double without rounding: " + d);
System.out.printf("double With rounding %.2f%n", d);

BigDecimal bd = BigDecimal.valueOf(60).divide(BigDecimal.valueOf(1.1), 9, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(1.1));
System.out.println("BigDecimal without rounding: " + bd);
System.out.printf("BigDecimal with rounding %.2f%n", bd);
// or
bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("BigDecimal with rounding: " + bd);

版画

代码语言:javascript
复制
double without rounding: 60.0
double With rounding 60.00
BigDecimal without rounding: 59.9999999995
BigDecimal with rounding 60.00
BigDecimal with rounding: 60.00

注意:double碰巧对这些值进行了正确的舍入,并给出了正确的答案。然而,选择一个不同的组合,这将是不正确的。例如54.545454545454545 * 1.1 => 60.00000000000001

票数 5
EN

Stack Overflow用户

发布于 2015-04-27 15:05:39

您需要使用String构造函数而不是double构造函数。60/1.1没有String表示,因为它是54。(54)

BigDecimal不支持不能写成固定长度小数的数字。

来自BigDecimal Javadoc:

在除法的情况下,精确商可以有一个无限长的十进制展开;例如,1除以3。如果商有一个不终止的十进制展开,并且指定了返回精确结果的运算,则抛出一个ArithmeticException。否则,将返回除法的确切结果,与其他操作一样。

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

https://stackoverflow.com/questions/29899323

复制
相关文章

相似问题

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