为什么当我为浮点数分配一个int时它是不是相同的值?

use*_*048 4 java

当我从一个int分配到一个浮点数时,我认为浮点数允许更高的精度,所以不会丢失或改变分配的值,但我所看到的是完全不同的东西.这里发生了什么?

for(int i = 63000000; i < 63005515; i++) { 
   int a = i;
   float f = 0; 
   f=a; 
   System.out.print(java.text.NumberFormat.getInstance().format(a) + " : " );
   System.out.println(java.text.NumberFormat.getInstance().format(f));
} 
Run Code Online (Sandbox Code Playgroud)

一些输出:

...

63,005,504:63,005,504

63,005,505:63,005,504

63,005,506:63,005,504

63,005,507:63,005,508

63,005,508:63,005,508

谢谢!

rge*_*man 14

A float具有与int-32位相同的位数.但它允许更大范围的值,远远大于int值的范围.但是,精度固定为24位(23"尾数"位,加上1个隐含1位).在大约63,000,000的值,精度大于1.您可以使用Math.ulp方法验证这一点,该方法给出了2个连续值之间的差异.

代码

System.out.println(Math.ulp(63000000.0f));
Run Code Online (Sandbox Code Playgroud)

版画

4.0
Run Code Online (Sandbox Code Playgroud)

您可以将double值用于更大(但仍然有限)的精度:

System.out.println(Math.ulp(63000000.0));
Run Code Online (Sandbox Code Playgroud)

版画

7.450580596923828E-9
Run Code Online (Sandbox Code Playgroud)

但是,您可以在int这里使用s,因为您的值大约为6300万,仍远低于最大可能int值,即大约20亿.