我使用了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/