将int转换为float并返回不提供初始值

Med*_*edo 5 java

-46当我们将浮点数转换为int时,此代码会打印出来,

这是因为在从int类型到float类型的转换过程中,信息丢失了。

int i = 1_234_567_890;
float f = i;
System.out.println(i - (int)f);   //print  -46
System.out.println(i - f);        //print 0.0
Run Code Online (Sandbox Code Playgroud)

在使用float和double时如何知道精度损失?

在测试之前分析代码时如何知道结果?

Dav*_*era 2

浮点表示与整数表示有很大不同。

在这里你可以看到这个规范(4.2.3.浮点类型)

在这里你可以看到整数表示

浮点表示使用符号、指数和尾数,并且 float 有

  • 符号(1 位)
  • 指数(8 位)
  • 尾数(23 位)

这样,float可以表示的最大值为:340,282,346,638,528,860,000,000,000,000,000,000,000.000000

long 可以表示的最大值为 9,223,372,036,854,775,807

int 可以表示的最大值为:2,147,483,647

因此,在从浮点型到长整型或整数的转换过程中,丢失的信息可能有多个数量级。

在整数到浮点转换期间,您最多可能会丢失 64u。细节,取决于价值。例如:

int i = 1_073_741_888;
float f = i;
System.out.println(i - (int)f);   //print  64
System.out.println(i - f);        //print 0.0
Run Code Online (Sandbox Code Playgroud)

int i = 1_073_742_016;
float f = i;
System.out.println(i - (int)f);   //print  -64
System.out.println(i - f);        //print 0.0
Run Code Online (Sandbox Code Playgroud)

该值的二进制整数表示形式为:

  • 1_073_741_888:1000000000000000000000001000000
  • 1_073_742_016:1000000000000000000000011000000

当值大于 16777216(2^24,因为浮点尾数大小为 -23 位)时,最低有效位将被舍入。