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

Abh*_*iya 2 java math

long mynum = Long.parseLong("7660142319573120");
long ans = (long)Math.sqrt(mynum) // output = 87522239
long ans_ans = ans * ans;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我得到ans_ans> mynum,它应该是<= mynum.为何如此行为?我也尝试使用节点js.结果也一样.

Tho*_*mas 5

Math.sqrtdoubles而不是longs上运行,因此mynum转换为double第一个.这是一个64位浮点数,具有"15-17十进制数字的精度"(维基百科).

您的输入数字有16位数,因此您可能已经失去输入的精度.您可能也会失去输出的精度.

如果你真的需要一个整数平方根long数,或者通常数字太大而无法准确表示为a double,请查看整数平方根算法.

您也可以使用LongMath.sqrt()Guava图书馆.