Java中的float和double数据types

浮点数据types是单精度32位IEEE 754浮点,双精度数据types是双精度64位IEEE 754浮点。

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

维基百科页面是一个很好的开始。

总结一下:

  • float用32位表示,其中1个符号位,8位指数和23位有效数(或者来自科学记号:2.33728 * 1012; 33728是有效数)。

  • double用64位表示,1个符号位,11位指数和52位有效位。

默认情况下,Java使用double来表示它的浮点数字(所以一个3.14的文字是double 3.14 )。 这也是数据types,会给你一个更大的数字范围,所以我强烈鼓励使用float

可能有某些图书馆实际上强迫你使用float ,但总的来说 – 除非你能保证你的结果足够小,以适应float的规定范围 ,那么最好selectdouble

如果您需要准确性 – 例如,您不能得到不准确的十进制值(如1/10 + 2/10 ),或者您正在做任何有关货币的事情 (例如,在系统中代表10.33美元),那么使用一个BigDecimal ,它可以支持任意数量的精度并处理这样的情况。

浮动给你约。 6-7小数位精度,而双倍给你约。 15-16。 此外,数字的范围是双倍大。

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

在评估需要小数精度的expression式时,使用浮点数(也称为实数)。 例如,诸如平方根之类的计算或诸如正弦和余弦之类的超越(transcendentals)会导致精度需要浮点types的值。 Java实现了标准(IEEE-754)浮点types和运算符集合。 浮点型和浮点型有两种,分别表示单精度和双精度数。 它们的宽度和范围如下所示:

  Name Width in Bits Range double 64 1 .7e–308 to 1.7e+308 float 32 3 .4e–038 to 3.4e+038 

浮动

floattypes指定使用32位存储的单精度值。 单精度在某些处理器上速度更快,占用双精度的一半,但当数值非常大或非常小时会变得不精确。 floattypes的variables在需要小数分量时非常有用,但不需要很高的精度。 例如,浮点数在表示美元和美分时可能很有用。

这里有一些浮点型variables声明的例子:

浮动高,低起伏;

如double关键字所示,双精度使用64位来存储值。 在一些为高速math计算而优化的现代处理器上,双精度实际上比单精度要快。 所有先验math函数(如sin(),cos()和sqrt())都会返回double值。 当你需要保持许多迭代计算的准确性,或者操纵大数值时,double是最好的select。

Java似乎有偏向于使用双重计算:

以我之前写的程序为例,当我使用float时,这些方法不起作用,但是现在当我用float(在NetBeans IDE中)replacefloat时,工作效果很好:

 package palettedos; import java.util.*; class Palettedos{ private static Scanner Z = new Scanner(System.in); public static final double pi = 3.142; public static void main(String[]args){ Palettedos A = new Palettedos(); System.out.println("Enter the base and height of the triangle respectively"); int base = Z.nextInt(); int height = Z.nextInt(); System.out.println("Enter the radius of the circle"); int radius = Z.nextInt(); System.out.println("Enter the length of the square"); long length = Z.nextInt(); double tArea = A.calculateArea(base, height); double cArea = A.calculateArea(radius); long sqArea = A.calculateArea(length); System.out.println("The area of the triangle is\t" + tArea); System.out.println("The area of the circle is\t" + cArea); System.out.println("The area of the square is\t" + sqArea); } double calculateArea(int base, int height){ double triArea = 0.5*base*height; return triArea; } double calculateArea(int radius){ double circArea = pi*radius*radius; return circArea; } long calculateArea(long length){ long squaArea = length*length; return squaArea; } } 

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

在Java程序中,我们通常主要看到使用双数据types。 这只是为了避免溢出,因为使用double数据types可以容纳的数字范围多于使用float时的范围。

同样当需要高精度时,鼓励使用双精度。 很久以前实现的库方法仍然需要使用float数据types(这只是因为它是使用float实现的,没有别的东西!)。

但是如果你确定你的程序需要less量的数据,并且在使用float的时候不会发生溢出,那么float的使用将大大地提高你的空间复杂度,因为float需要double的内存的一半。