Java';s Math.pow把结果四舍五入?

Java';s Math.pow把结果四舍五入?,java,math,floating-accuracy,pow,Java,Math,Floating Accuracy,Pow,今天我遇到了一个奇怪的数学行为。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()只

今天我遇到了一个奇怪的数学行为。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()只要传递给它的参数是整数或long,只要没有溢出(在本例中是这样),就会产生精确的结果。

因为它将
long
转换为
double

System.out.println((double)999999999999999999L);
产出:

1.0E18
1000000000000000000

产出:

1.0E18
1000000000000000000

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

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

这段代码正在从long转换为double和back。。。如果在没有Math.pow()的情况下进行转换,会发生什么?它不是做同样的事情吗?@MichaelAaronSafyan你是对的<代码>长N3=(长)(双)N1
long
double
都占用64位,并且有很多
double
值不能用
long
精确表示。因此,肯定有很多
值不能用
双精度
精确表示。您已经找到了其中的一个。+1,但是由于double没有精确打印,因此编写
System.out.println((long)(double)99999999999l)将是一个更好的演示谢谢,这帮助我了解了幕后发生的事情。