Java';s Math.pow返回1个错误

Java';s Math.pow返回1个错误,java,Java,如果我在Java中运行Math.pow(15,14),结果如下 29192926025390624 但是,如果我在windows的科学计算器中运行15^14,它会返回 29192926025390625 这是因为Math.pow(a,b)使用double进行计算吗 如果是这样,解决这类问题的最佳方法是什么?(例如,在Java中获得15^14的正确答案)舍入错误是您怀疑的,因为Math.pow()使用的浮点算法。。double无法保存值29192926025390625,如下代码片段所示: d

如果我在Java中运行
Math.pow(15,14)
,结果如下

29192926025390624
但是,如果我在windows的科学计算器中运行15^14,它会返回

29192926025390625
这是因为
Math.pow(a,b)
使用
double
进行计算吗


如果是这样,解决这类问题的最佳方法是什么?(例如,在Java中获得15^14的正确答案)

舍入错误是您怀疑的,因为
Math.pow()使用的浮点算法。
double
无法保存值
29192926025390625
,如下代码片段所示:

double d = 29192926025390625L;
System.out.println(d);
哪张照片

2.9192926025390624E16
您可以使用
biginger
来避免舍入问题:

BigInteger b = new BigInteger("15");
BigInteger result = b.pow(14);

舍入错误是您所怀疑的,因为
Math.pow()
使用了浮点算法。
double
无法保存值
29192926025390625
,如下代码片段所示:

double d = 29192926025390625L;
System.out.println(d);
哪张照片

2.9192926025390624E16
您可以使用
biginger
来避免舍入问题:

BigInteger b = new BigInteger("15");
BigInteger result = b.pow(14);

最佳答案取决于应用程序所需的精确数学特性。请注意,如果这种行为让您感到惊讶,您对“我的应用程序需要什么数学属性”问题的本能反应可能不准确。双精度是精确到大约15.9位小数。您的值为17。你不能从一品脱罐中得到一夸脱。答案已经给出,但是一般的话:如果你想计算一个只涉及整数的幂,那么你应该考虑创建自己的<代码> POW方法,该方法在<代码>长值上运行。它不仅可以解决这里的精度问题,而且效率也会更高(如果实现正确的话),最佳答案取决于应用程序所需的精确数学属性。请注意,如果这种行为让您感到惊讶,您对“我的应用程序需要什么数学属性”问题的本能反应可能不准确。双精度是精确到大约15.9位小数。您的值为17。你不能从一品脱罐中得到一夸脱。答案已经给出,但是一般的话:如果你想计算一个只涉及整数的幂,那么你应该考虑创建自己的<代码> POW方法,该方法在<代码>长值上运行。它不仅可以解决这里的精度问题,而且在15^14 a
long
足够长的情况下,它的效率也会更高(如果实施得当,使用)。此外,一旦使用任何整数而不是浮点数,要避免的问题是溢出,而不是取整。@delnan:这里的问题是取整,请参阅我的编辑。@delnan keppil是对的,
Math.pow()
double
中处理返回值,当使用浮点数时,它在
long
转换中取整,例如,通过
Math.pow
,它是四舍五入的。使用整数类型时,没有舍入,只有溢出。这就是为什么我说“一旦使用任何整数而不是浮点数”——我领先了一步,想到了一个基于
long
的解决方案。实际上,对于15^14,一个
long
就足够了。此外,一旦使用任何整数而不是浮点数,要避免的问题是溢出,而不是取整。@delnan:这里的问题是取整,请参阅我的编辑。@delnan keppil是对的,
Math.pow()
double
中处理返回值,当使用浮点数时,它在
long
转换中取整,例如,通过
Math.pow
,它是四舍五入的。使用整数类型时,没有舍入,只有溢出。这就是为什么我说“一旦使用任何整数而不是浮点数”——我领先了一步,想到了一个基于
的解决方案。