如何在java中将float转换为double?

Gau*_*war 7 java

我在java中编写以下代码并检查存储在变量中的值.当我在一个双变量'y'中存储1.2时,它变为1.200000025443.为什么不是1.2亿个?

public class DataTypes

{
    static public void main(String[] args)
    {
        float a=1;
        float b=1.2f;
        float c=12e-1f;
        float x=1.2f;
        double y=x;

        System.out.println("float a=1 shows a= "+a+"\nfloat b=1.2f shows b= "+b+"\nfloat c=12e-1f shows c= "+c+"\nfloat x=1.2f shows x= "+x+"\ndouble y=x shows y= "+y);
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到输出:

float a=1 shows a= 1.0
float b=1.2f shows b= 1.2
float c=12e-1f shows c= 1.2
float x=1.2f shows x= 1.2
double y=x shows y= 1.2000000476837158

zmo*_*zmo 1

之所以存在这样的问题,是因为计算机只能处理离散数学,因为微处理器只能表示内部整数,而不能表示小数。因为我们不仅可以使用这些数字,还可以使用小数,为了避免这种情况,几十年前非常聪明的工程师发明了浮点表示形式,标准化为IEEE754

IEEE754规范定义了如何在内存解释浮点数和双精度数。基本上,与表示精确值的 int 不同,float 和 double 是通过以下计算得出的:

浮点表示

  • 符号
  • 指数
  • 分数

所以这里的问题是,当您存储1.2为双精度时,您实际上存储了它的二进制近似值:

00111111100110011001100110011010
Run Code Online (Sandbox Code Playgroud)

这为您提供了可以使用二进制分数存储的最接近的 1.2 表示,但不完全是该分数。在十进制小数中,12*10^-1给出精确值,但在二进制小数中,它不能给出精确值。

(参见http://www.h-schmidt.net/FloatConverter/IEEE754.html,因为我懒得自己做)

当我将 1.2 存储在双变量 'y' 中时,它变成 1.200000025443

实际上,在 的 float 和 double 版本中y,该值实际上是1.2000000476837158,但由于 float 的尾数较小,表示的值在近似值之前被截断,使您相信它是一个精确值,而在内存中它不是。