Java Math.pow的错误结果

时间:2012-03-31 13:54:49

标签: java math long-integer 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 返回的结果。任何可能导致它的想法?

6 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:5)

这不是精确度问题。 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)。 C中的实现可在e_pow.c获得。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

正确答案是提供可以用double

表示的最接近的数字

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

答案 5 :(得分:0)

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

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

成功!!!