首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Math.sqrt()在java中输出错误的值?

为什么Math.sqrt()在java中输出错误的值?
EN

Stack Overflow用户
提问于 2017-02-16 15:52:38
回答 5查看 2.4K关注 0票数 2
代码语言:javascript
运行
复制
long mynum = Long.parseLong("7660142319573120");
long ans = (long)Math.sqrt(mynum) // output = 87522239
long ans_ans = ans * ans;

在本例中,我将在应该为<=mynum的位置获取ans_ans > mynum。为什么会有这样的行为?我也尝试过使用node js。结果也是一样的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-02-16 16:04:24

您正在使用long调用Math.sqrt。正如JavaDoc所指出的,它返回一个“正确四舍五入的值”。

由于平方根不是非逗号(87522238,999999994),因此将结果向上舍入到输出87522239

在此之后,该值的平方直观地大于mynum,因为您要乘以比根更大的数字!

票数 4
EN

Stack Overflow用户

发布于 2017-02-16 16:04:08

Math.sqrtdouble%s上运行,而不是在long%s上运行,因此首先将mynum转换为double。这是一个64位的浮点数,它有“15-17个十进制数字的精度”(Wikipedia)。

您的输入数字为16位,因此您可能已经失去了输入的精度。您可能还会失去输出的精确度。

如果您确实需要long数的整数平方根,或者通常需要太大而无法准确表示为double的数字,请查看integer square root算法。

您还可以使用Guava库中的LongMath.sqrt()

票数 5
EN

Stack Overflow用户

发布于 2017-02-16 16:11:24

代码语言:javascript
运行
复制
double ans = (double)Math.sqrt(15);
System.out.println("Double : " + ans);
double ans_ans = ans * ans;
System.out.println("Double : " + ans_ans);

long ans1 = (long)Math.sqrt(15);
System.out.println("Long : " + ans1);
long ans_ans1 = ans1 * ans1;
System.out.println("Long : " + ans_ans1);

结果:

代码语言:javascript
运行
复制
Double : 3.872983346207417
Double : 15.000000000000002
Long : 3
Long : 9

我希望这能让你明白这一点。

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

https://stackoverflow.com/questions/42267940

复制
相关文章

相似问题

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