java - Java中从long到float的信息丢失

标签 java long-integer primitive

如果调用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 具有更高的精度),但它仍然可能有损。

同样,很容易看出它必须是有损的 - 尽管 longdouble 都以 64 位表示,但显然有 double 值不能表示为 long 值(简单地说,0.5 就是一个),这意味着必须有一些 long 值不能完全表示为 double > 值(value)观。

关于java - Java中从long到float的信息丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59692565/

相关文章:

java - 不一致的快速排序 StackOverflowError

java - 加载 XML 非常慢

java - 为什么 XPath last() 函数不能像我预期的那样工作?

C# - 列表 Sum() OverflowException : Arithmetic operation resulted in an overflow

java - 对象、堆或堆栈中的原语?

c++ - 为什么 C++ 原始类型不像其他类型那样被初始化?

java - org.hibernate.propertyvalueexception not-null 属性引用 null

java - 在 MySQL : INT vs LONG vs BIGINT 中存储美元金额

javascript - 你如何扩展像 Object 或 Number 这样的内置函数的构造函数?

C# 随机(长)