精度损失 - int ->浮点数或双精度

2022-09-01 13:29:04

我有一个正在复习的考试题目,题目是4分。

“在java中,我们可以将int分配给双精度或浮点数”。这会丢失信息吗,为什么?

我之所以这么说,是因为int通常是固定的长度或大小 - 存储数据的精度是有限的,其中在浮点中存储信息可能是无限的,本质上我们因此而丢失信息。

现在我对我是否在这里击中了正确的区域有点粗略。我非常确定它会失去精确度,但我不能完全把我的手指放在为什么。我能得到一些帮助吗?


答案 1

在 Java 中,Integer 使用 32 位来表示其值。

在Java中,FLOAT使用23位尾数,因此大于2 ^ 23的整数将被截断其最低有效位。例如,33554435(或0x200003)将被截断到大约 33554432 +/- 4

在Java中,DOUBLE使用52位尾数,因此能够表示32位整数而不会丢失数据。

另见维基百科上的“浮点


答案 2

没有必要知道浮点数的内部布局。您所需要的只是鸽子洞原理和知识,并且大小相同。intfloat

  • int是一种 32 位类型,其每个位模式表示一个不同的整数,因此有 2^32 个值。int
  • float是 32 位类型,因此它最多有 2^32 个不同的值。
  • 某些 s 表示非整数,因此表示整数的值少于 2^32。floatfloat
  • 因此,不同的值将转换为相同的值(=精度损失)。intfloat

类似的推理可以与 和 一起使用。longdouble