long mynum = Long.parseLong("7660142319573120");
long ans = (long)Math.sqrt(mynum) // output = 87522239
long ans_ans = ans * ans;
在本例中,我将在应该为<=mynum的位置获取ans_ans > mynum。为什么会有这样的行为?我也尝试过使用node js。结果也是一样的。
发布于 2017-02-16 16:04:24
您正在使用long调用Math.sqrt
。正如JavaDoc所指出的,它返回一个“正确四舍五入的值”。
由于平方根不是非逗号(87522238,999999994
),因此将结果向上舍入到输出87522239
。
在此之后,该值的平方直观地大于mynum
,因为您要乘以比根更大的数字!
发布于 2017-02-16 16:04:08
Math.sqrt
在double
%s上运行,而不是在long
%s上运行,因此首先将mynum
转换为double
。这是一个64位的浮点数,它有“15-17个十进制数字的精度”(Wikipedia)。
您的输入数字为16位,因此您可能已经失去了输入的精度。您可能还会失去输出的精确度。
如果您确实需要long
数的整数平方根,或者通常需要太大而无法准确表示为double
的数字,请查看integer square root算法。
您还可以使用Guava库中的LongMath.sqrt()
。
发布于 2017-02-16 16:11:24
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);
结果:
Double : 3.872983346207417
Double : 15.000000000000002
Long : 3
Long : 9
我希望这能让你明白这一点。
https://stackoverflow.com/questions/42267940
复制相似问题