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

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


当前回答

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

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

其他回答

这将给出错误:

public class MyClass {
    public static void main(String args[]) {
        float a = 0.5;
    }
}

/MyClass.java:3:错误:不兼容的类型:从double类型到float类型的可能有损转换 浮动a = 0.5;

这将工作得非常好

public class MyClass {
    public static void main(String args[]) {
        double a = 0.5;
    }
}

这也会工作得很好

public class MyClass {
    public static void main(String args[]) {
        float a = (float)0.5;
    }
}

原因:Java默认将实数存储为double,以确保更高的精度。

在计算过程中,Double占用更多空间但更精确,float占用更少空间但更精确。

尽管如此,Java似乎倾向于使用double进行计算:

以我今天早些时候写的程序为例,当我使用float时,这些方法不起作用,但现在当我用double替换float时工作得很好(在NetBeans IDE中):

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;
    }
}

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

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

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

总结如下:

Float用32位表示,其中1位符号位,8位指数位和23位有效位(或者从科学计数数后面跟随:2.33728*1012;33728是有效值)。 Double用64位表示,其中1个符号位、11个指数位和52个有效位。

默认情况下,Java使用double来表示浮点数(因此文字3.14被键入为double)。它也是一种数据类型,会给你一个更大的数字范围,所以我强烈建议使用它而不是float。

可能会有某些库强制你使用float,但一般来说——除非你能保证你的结果足够小,适合float的规定范围,否则最好选择double。

如果您需要精度—例如,您不能使用不准确的十进制值(如1/10 + 2/10),或者您正在处理与货币相关的任何事情(例如,在系统中表示10.33美元),那么使用BigDecimal,它可以支持任意数量的精度并优雅地处理此类情况。

Floating-point numbers, also known as real numbers, are used when evaluating expressions that require fractional precision. For example, calculations such as square root, or transcendentals such as sine and cosine, result in a value whose precision requires a floating-point type. Java implements the standard (IEEE–754) set of floatingpoint types and operators. There are two kinds of floating-point types, float and double, which represent single- and double-precision numbers, respectively. Their width and ranges are shown here:

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

浮动

float类型指定使用32位存储的单精度值。单精度在某些处理器上更快,占用的空间是双精度的一半,但是当值非常大或非常小时就会变得不精确。float类型的变量在需要小数分量时非常有用,但不需要很高的精度。

下面是一些浮动变量声明的例子:

浮动高温度,低温度;

Double precision(由Double关键字表示)使用64位来存储值。在一些为高速数学计算而优化的现代处理器上,双精度实际上比单精度更快。所有先验数学函数,如sin()、cos()和sqrt(),都返回双值。当您需要在多次迭代计算中保持精度时,或者需要处理大数值时,double是最好的选择。