首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java: Math.pow返回混乱的结果

Java: Math.pow返回混乱的结果
EN

Stack Overflow用户
提问于 2017-09-29 03:05:38
回答 1查看 124关注 0票数 1

我正在研究Java语言中的Math.pow()函数,但是下面的代码给出了不同的结果,分别如下所示。

案例1:

代码语言:javascript
运行
复制
BigDecimal divisor = new BigDecimal(Math.pow(10,9)+7);
BigDecimal dividend = new BigDecimal(1000000000543543509L);
System.out.println(dividend.remainder(divisor)); // 543543558

案例2:

代码语言:javascript
运行
复制
System.out.println((1000000000543543509L%((int)Math.pow(10,9)+7))+""); 
//543543558

案例3:

代码语言:javascript
运行
复制
System.out.println((1000000000543543509L%(Math.pow(10,9)+7))+""); //5.43543601E8

为什么我在案例2和案例3中得到不同的结果,而在案例1和案例2中得到相同的结果?以上哪种情况最准确?

EN

回答 1

Stack Overflow用户

发布于 2017-09-29 03:22:56

在前两种情况下,long的值保留了long的所有精度。在第三种情况下,long被强制转换为double,并且一些精度会丢失。请注意,pow返回一个双精度值,double + int会将int转换为双精度值。同样,long%double会导致long类型转换为double。

我们可以通过显式执行强制转换来演示结果:

代码语言:javascript
运行
复制
System.out.println((long)((double)1000000000543543509L));
#1000000000543543552

您可以使用模数来验证该值是否为op得到的值。

代码语言:javascript
运行
复制
System.out.println(1000000000543543552L%((int)(Math.pow(10, 9) + 7)));
#543543601

所以问题不在于功率,而在于长度不适合双倍大小。

更广泛地说,如果我们参考Widening Primitive Conversion上的jls,我们可以看到long可以在没有显式强制转换的情况下提升为double (或float)。这是因为它不会丢失任何量级信息。尽管如本例所示,您可能会丢失一些精度。

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

https://stackoverflow.com/questions/46476565

复制
相关文章

相似问题

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