Java的Math.pow是否完善了结果?

时间:2014-12-28 21:53:37

标签: java math floating-accuracy pow

今天我遇到了Math.pow()的一种奇特行为。我无法理解以下java代码的输出:

long N1 = 999999999999999999L;
System.out.println("N1 : " + N1);

long N2 = (long) Math.pow(N1, 1);
System.out.println("N2 : " + N2);

我得到以下输出:

N1 : 999999999999999999
N2 : 1000000000000000000

我一直以为Math.pow()会产生精确的结果,只要传递给它的参数是整数或长整数,前提是没有溢出(在这种情况下也是如此)。

2 个答案:

答案 0 :(得分:10)

因为它会将long转换为double

System.out.println((double)999999999999999999L);

输出:

1.0E18

System.out.println((long)(double)999999999999999999L);

输出:

1000000000000000000

答案 1 :(得分:0)

您可以使用BigDecimal进行此类计算,而不会在类型之间转换时失去精确度:

BigDecimal b = new BigDecimal(999999999999999999L);
BigDecimal pow = b.pow(1);