Java Math.pow的错误结果

如果您尝试运行以下代码

public class Main { public static void main(String[] args) { long a = (long)Math.pow(13, 15); System.out.println(a + " " + a%13); } } 

你会得到“51185893014090752 8”

13 ^ 15的正确值是51185893014090757 ,即大于Math.pow返回的结果5 。 任何可能导致它的想法?

您已经超过了双精度浮点值中可用的有效位数(~15到16)。 一旦你这样做,你不能指望你的结果中最不重要的数字实际上是有意义的/精确的。

如果在Java中需要任意精确的算术,请考虑使用BigIntegerBigDecimal

问题是当你得到越来越高的double值时,连续值之间的差距会增加 – 一个double不能代表其范围内的每个整数值,这就是这里出了问题。 它将最接近的 double值返回到确切的结果。

这不是精确度问题。 Math.pow方法执行结果的近似。 要获得正确的结果,请使用以下代码。

 long b = 13; for(int i = 0; i != 14; i ++) { b = b * 13; } System.out.println(b); 

输出是预期结果51185893014090757L。

更一般地,当指数是整数时,应避免使用Math.pow方法。 首先,结果是近似值,其次是计算成本更高。

Math.pow(以及Math类中的大多数其他方法)的实现基于网络库netlib作为“Freely Distributable Math Library”包(请参阅StrictMath javadoc )。 可以在e_pow.c上找到C中的实现。

double具有有限精度,其尾数为52位,大致等于15到16位小数。 因此,您尝试计算的数字不能再精确地用双精度表示。

正确的答案是提供可以用double表示的最接近的数字

你检查过是否是这种情况?

这是因为通过强制转换为double来保持数字的限制,浮动你可能但它会有一些错误,你应该自己处理计算的数字,将它们保存在一个不是一个简单方法的数组中

但是在python编程语言中你可以得到任何长度的结果,它是如此强大!

成功的!!!