float数据类型是单精度32位IEEE 754浮点数,double数据类型是双精度64位IEEE 754浮点数。

这是什么意思?什么时候应该使用float而不是double,反之亦然?


当前回答

这个例子演示了如何从Java中的浮点数中提取符号(最左边的位)、指数(后面的8位)和尾数(最右边的23位)。

int bits = Float.floatToIntBits(-0.005f);
int sign = bits >>> 31;
int exp = (bits >>> 23 & ((1 << 8) - 1)) - ((1 << 7) - 1);
int mantissa = bits & ((1 << 23) - 1);
System.out.println(sign + " " + exp + " " + mantissa + " " +
  Float.intBitsToFloat((sign << 31) | (exp + ((1 << 7) - 1)) << 23 | mantissa));

同样的方法可以用于double(11位指数和52位尾数)。

long bits = Double.doubleToLongBits(-0.005);
long sign = bits >>> 63;
long exp = (bits >>> 52 & ((1 << 11) - 1)) - ((1 << 10) - 1);
long mantissa = bits & ((1L << 52) - 1);
System.out.println(sign + " " + exp + " " + mantissa + " " +
  Double.longBitsToDouble((sign << 63) | (exp + ((1 << 10) - 1)) << 52 | mantissa));

来源:http://s-j.github.io/java-float/

其他回答

浮点数给你大约。6-7个十进制数字的精度,而双精度给你大约。15 - 16岁。对于double,数字的范围也更大。

double类型需要8个字节的存储空间,而float类型只需要4个字节。

根据IEEE标准,float是实数的32位表示,而double是64位表示。

在Java程序中,我们通常看到双数据类型的使用。这只是为了避免溢出,因为使用double数据类型可以容纳的数字范围比使用float时的范围更大。

同样,当要求高精度时,鼓励使用double。很少有很久以前实现的库方法仍然要求必须使用float数据类型(这只是因为它是使用float实现的,没有别的!)。

但是如果你确定你的程序需要很小的数字,并且使用float不会发生溢出,那么使用float将极大地提高你的空间复杂性,因为float所需要的内存是所需要的两倍。

你应该使用double而不是float进行精确的计算,使用float而不是double进行不精确的计算。Float只包含十进制数,但double包含一个IEEE754双精度浮点数,使其更容易包含和更准确地计算数字。希望这能有所帮助。

这个例子演示了如何从Java中的浮点数中提取符号(最左边的位)、指数(后面的8位)和尾数(最右边的23位)。

int bits = Float.floatToIntBits(-0.005f);
int sign = bits >>> 31;
int exp = (bits >>> 23 & ((1 << 8) - 1)) - ((1 << 7) - 1);
int mantissa = bits & ((1 << 23) - 1);
System.out.println(sign + " " + exp + " " + mantissa + " " +
  Float.intBitsToFloat((sign << 31) | (exp + ((1 << 7) - 1)) << 23 | mantissa));

同样的方法可以用于double(11位指数和52位尾数)。

long bits = Double.doubleToLongBits(-0.005);
long sign = bits >>> 63;
long exp = (bits >>> 52 & ((1 << 11) - 1)) - ((1 << 10) - 1);
long mantissa = bits & ((1L << 52) - 1);
System.out.println(sign + " " + exp + " " + mantissa + " " +
  Double.longBitsToDouble((sign << 63) | (exp + ((1 << 10) - 1)) << 52 | mantissa));

来源:http://s-j.github.io/java-float/

在常规编程计算中,我们不使用浮点数。如果我们确保结果范围在浮点数据类型的范围内,那么我们可以选择一个浮点数据类型来节省内存。一般来说,我们使用double的原因有两个:-

If we want to use the floating-point number as float data type then method caller must explicitly suffix F or f, because by default every floating-point number is treated as double. It increases the burden to the programmer. If we use a floating-point number as double data type then we don’t need to add any suffix. Float is a single-precision data type means it occupies 4 bytes. Hence in large computations, we will not get a complete result. If we choose double data type, it occupies 8 bytes and we will get complete results.

float和double数据类型都是专门为科学计算设计的,在科学计算中,近似误差是可以接受的。如果精度是最优先考虑的问题,那么建议使用BigDecimal类而不是float或double数据类型。Java中的浮点和双数据类型