如果调用Java的以下方法
void processIt(long a) {
float b = a; /*do I have loss here*/
}
将 long 变量分配给 float 变量时是否会丢失信息?
Java 语言规范规定 float 类型是 long 的父类(super class)型。
最佳答案
Do I have information loss when I assign the long variable to the float variable?
有可能,是的。从 long
有 64 位信息,而 float
只有 32 位信息这一事实来看,这一点应该相当清楚。
更具体地说,随着 float
值变大,连续值之间的间隙变得大于 1 - 而对于 long
,连续值之间的间隙始终 1。
举个例子:
long x = 100000000L;
float f1 = (float) x;
float f2 = (float) (x + 1);
System.out.println(f1 == f2); // true
换句话说,两个不同 long
值在 float
中具有相同的最接近的表示形式。
这不仅仅适用于 float
- 它也可能发生在 double
上。在这种情况下,数字必须更大(因为 double
具有更高的精度),但它仍然可能有损。
同样,很容易看出它必须是有损的 - 尽管 long
和 double
都以 64 位表示,但显然有 double
值不能表示为 long
值(简单地说,0.5 就是一个),这意味着必须有一些 long
值不能完全表示为 double
> 值(value)观。
关于java - Java中从long到float的信息丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59692565/