我有这个功能:
enemigo.posZ = 5.1529696E8 //This is the value at runtime, it's a float.
double posicionZ = Math.round(enemigo.posZ*100.0f)/100.0f;
这是输出,但为什么?它应该将它舍入为整数!
posicionZ = 2.1474836E7
答案 0 :(得分:2)
一个有大量数字的整数,以21474开头...应该是一个线索!
Java有Math.round()
的两个版本:
public static int Math.round(float a) // float -> 32-bit int
public static long Math.round(double a) // double -> 64-bit long
让我们看一下代码:
double posicionZ = Math.round(enemigo.posZ * 100.0f) / 100.0f;
由于enemigo.posZ
是浮点数,因此使用第一个版本。它希望将enemigo.posZ * 100.0
或51529696000.0作为32位int返回,但它不能因为它溢出而返回。所以它返回Integer.MAX_VALUE
,或2 ^³¹ - 1 = 2147483647.然后100.0f的divison返回21474836.0,即2.1474836E7。