当我从 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/