如果您尝试运行以下代码
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 返回的结果。任何可能导致它的想法?
答案 0 :(得分:10)
您已经超过了双精度浮点值中可用的有效位数(~15到16)。一旦你这样做,你就不能指望你的结果中最不重要的数字实际上是有意义/精确的。
如果您需要在Java中进行任意精确的算术运算,请考虑使用BigInteger
和BigDecimal
。
答案 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编程语言中你可以得到任何长度的结果,它是如此强大!
成功!!!