如果您尝试运行下面的代码
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中任意精度运算,可以考虑使用BigInteger
和BigDecimal
。
问题是,当你越来越高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中的包“可自由分发的数学库”(见StrictMath的javadoc )。 用C实现可在e_pow.c 。
双具有有限的精度,其尾数为52个比特,这大致等于15至16位小数。 所以,你想计算数量不能由双任何更多的代表(完全一致)。
正确的答案是提供一种可以由代表最接近的数double
你检查是否是这种情况或不?
这是因为由铸造翻一番持有长数字的限制,浮你可以,但会有一些错误,你应该自己处理计算的数字将其储存在一个数组,这不是一个简单的方法
但在Python编程语言,你可以有任意长度的结果,它是如此的强大!
成功的!!!