13

如果您尝试运行以下代码

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,即大于5Math.pow返回的结果。关于可能导致它的任何想法?

4

6 回答 6

11

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

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

于 2012-03-31T13:59:58.773 回答
6

问题是,随着您获得越来越高的double值,连续值之间的差距会增加 - adouble不能代表其范围内的每个整数值,这就是这里出了问题。它返回最接近 double确切结果的值。

于 2012-03-31T13:59:45.073 回答
6

这不是精度问题。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 作为包“可自由分发的数学库”(参见StrictMath javadoc)。C 中的实现可在e_pow.c 获得

于 2014-02-18T11:51:56.463 回答
1

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

于 2012-03-31T13:59:43.547 回答
0

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

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

于 2012-03-31T13:59:47.103 回答
0

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

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

成功的!!!

于 2012-03-31T15:33:15.010 回答