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

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

一些输出:

...

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

谢谢!

最佳答案

float 的位数与 int 相同——32 位。但它允许更大范围的值,远大于 int 值的范围。但是,精度固定为 24 位(23 个“尾数”位,加上 1 个隐含的 1 位)。在大约 63,000,000 的值处,精度大于 1 。您可以使用 Math.ulp 方法进行验证,该方法给出2个连续值之间的差。

编码

System.out.println(Math.ulp(63000000.0f));

打印
4.0

您可以使用 double 值来获得更高(但仍然有限)的精度:
System.out.println(Math.ulp(63000000.0));

打印
7.450580596923828E-9

但是,您可以在此处仅使用 int ,因为您的值约为 6300 万,仍远低于可能的最大 int 值(约为 20 亿)。

关于java - 为什么当我将int分配给float时,它的值是否不相同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23897829/

10-12 02:17