Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的Float和double数据类型_Java_Floating Point_Double_Ieee 754 - Fatal编程技术网

Java中的Float和double数据类型

Java中的Float和double数据类型,java,floating-point,double,ieee-754,Java,Floating Point,Double,Ieee 754,浮点数据类型为单精度32位IEEE 754浮点,双精度数据类型为双精度64位IEEE 754浮点 这是什么意思?什么时候应该使用浮点而不是双精度,反之亦然?浮点给出大约6-7位小数精度,而双精度给出大约15-16位小数精度。此外,双倍的数字范围更大 一个double需要8字节的存储空间,而float只需要4字节。它上面的是一个很好的开始 总而言之: float以32位表示,其中1位为符号位,8位为指数,23位为有效位(或由科学符号编号得出的结果:2.33728*1012;33728为有效位)

浮点数据类型为单精度32位IEEE 754浮点,双精度数据类型为双精度64位IEEE 754浮点


这是什么意思?什么时候应该使用浮点而不是双精度,反之亦然?

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

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

它上面的是一个很好的开始

总而言之:

  • float
    以32位表示,其中1位为符号位,8位为指数,23位为有效位(或由科学符号编号得出的结果:2.33728*1012;33728为有效位)

  • double
    以64位表示,其中1位为符号位,11位为指数位,52位为有效位

默认情况下,Java使用
double
表示其浮点数字(因此键入的是
double
文本
3.14
)。它也是一种数据类型,它将为您提供更大的数字范围,因此我强烈建议您在
float
上使用它

可能有某些库实际上强制您使用
浮点
,但一般来说-除非您能保证结果足够小,适合
浮点
,否则最好选择使用
双精度


如果您需要准确性-例如,您不能有不准确的十进制值(如
1/10+2/10
),或者您正在用货币做任何事情(例如,在系统中表示$10.33),那么请使用
BigDecimal
,它可以支持任意精度,并能优雅地处理类似情况。

浮点数,也称为实数,用于计算需要分数精度的表达式。例如,计算(如平方根)或超越(如正弦和余弦)会产生精度要求浮点类型的值。Java实现了一组标准(IEEE–754)的浮点类型和运算符。有两种浮点类型,float和double,分别表示单精度和双精度数字。其宽度和范围如下所示:



浮动

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

以下是一些浮点变量声明示例:

浮子高温、低温


双倍

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

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

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

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

此外,当需要高精度时,鼓励使用双精度。很久以前实现的一些库方法仍然必须使用float数据类型(这只是因为它是使用float实现的,而不是其他方式!)


但是,如果您确信您的程序需要较小的数字,并且使用float不会发生溢出,那么使用float将大大提高您的空间复杂性,因为float需要double所需的一半内存。

Java似乎倾向于使用double进行计算:

举个例子,在我今天早些时候编写的程序中,当我使用float时,这些方法不起作用,但当我用double(在NetBeans IDE中)替换float时,这些方法非常有效:


这个示例演示了如何在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));
int bits=Float.floatToIntBits(-0.005f);
int符号=位>>>31;

int exp=(位>>>23&((1 52&)((1这将给出错误:

public class MyClass {
    public static void main(String args[]) {
        float a = 0.5;
    }
}
/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;
    }
}
这也将非常有效

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占用更多空间,但精度更高,而float占用更少空间,但精度更低。

精确计算时,应使用Double而不是float,使用精度更低的计算时,应使用float而不是Double。float仅包含十进制数,但Double包含IEEE754双精度浮点数ber,更容易包含和更准确地计算数字。希望这有帮助。

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

  • 如果我们想使用浮点数作为浮点数据类型,那么方法调用方必须显式地suf