我使用了Math.pow()方法,得到的结果与从计算器得到的结果不同。

我使用的代码:

public static int getSum(int a, int b, int c, int d){
    return (int)(d*Math.pow(16.0,6.0)+c*Math.pow(16.0,4.0)+b*Math.pow(16.0,2.0)+a);
}


列印

 getSum(0,0,128,191)


打印出2147483647
而Google计算器显示3212836864。

是什么原因造成的?

最佳答案

只是要对现有答案进行解释(例如,如果有人想知道为什么没有整数溢出):

The spec在5.1.3下说。缩小原始转换


  第一步,将浮点数转换为
  long(如果T为long或int),如果T为byte,short,char或int,
  如下:
  
  
  如果浮点数为NaN(第4.2.3节),则转换第一步的结果为int或long 0。
  否则,如果浮点数不是无穷大,则将浮点值四舍五入为整数值V,四舍五入
  使用IEEE 754舍入为零模式(第4.2.3节)将其向零。然后
  有两种情况:
  
  
  如果T为long,并且此整数值可以表示为long,那么第一步的结果就是long值V。
  否则,如果此整数值可以表示为int,则第一步的结果是int值V。
  
  否则,以下两种情况之一必须为真:
  
  
  该值必须太小(大值的负值或负无穷大),第一步的结果是
  int或long类型的最小可表示值。
  该值必须太大(正值大或正无穷大),第一步的结果是
  int或long类型的最大可表示值。
  
  


因此,您从double返回的Math.pow值将转换为最大可表示的int(即Integer.MAX_VALUE)。

请注意,此部分特定于浮点数转换。如果您的方法是定义为(请注意对long的附加强制转换)

public static int getSum(int a, int b, int c, int d){
    // Casting twice doesn't make sense. It's just here for demonstration.
    return (int)(long)(d*Math.pow(16.0,6.0)+c*Math.pow(16.0,4.0)+b*Math.pow(16.0,2.0)+a);
}


规格中的相应部分将是


  将有符号整数缩小为整数T
  只是丢弃除n个最低顺序位以外的所有位,其中n是数字
  表示类型T的比特数。除了可能丢失
  有关数值大小的信息,这可能会导致
  结果值的符号与输入的符号不同
  值。


并且您的方法将返回-1082130422(又名整数溢出)。

关于java - Java math.pow()返回错误答案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37196748/

10-11 22:23
查看更多