当我从 int 赋值给 float 时,我认为 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
值,即大约 2亿。
关于java - 为什么当我将一个 int 分配给一个 float 时,它不是相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23897829/