'有损转换'与'精度损失'

时间:2018-06-08 06:07:22

标签: java compiler-errors

有人可以解释/链接任何可以区分

的文档
  

可能丢失精度错误

  

有损转换。

我无法理解在什么情况下会发生什么错误。 任何有关示例的解释都深表赞赏

2 个答案:

答案 0 :(得分:1)

不同之处在于被切断的数字的结尾:

  • 有损转换返回最低有效位。它在JLS Sec 5.1.3中描述:

      

    有符号整数到整数类型T的缩小转换只会丢弃除n个最低位之外的所有位,其中n是用于表示类型T的位数。除了可能丢失有关幅度的信息之外数值,这可能导致结果值的符号与输入值的符号不同。

    类似于将int转换为字节:在这种情况下,您只需获得8个最低有效位:

    System.out.println((byte) 258); // 2
    
  • 精度损失会返回最重要的位。它在JLS Sec 5.1.2中描述:

      

    从int到float,或从long到float,或从long到double的扩展原语转换可能会导致精度损失 - 也就是说,结果可能会失去一些最不重要的价值的一部分。

    就像在浮点数中存储一个int太大而无法准确表示

    int i = (1 << 24) + 1;
    float f = i;
    System.out.println((int) f == i); // false, because precision is lost.
    

答案 1 :(得分:0)

当您尝试将double转换为int时,可能会丢失精度错误。您正在尝试将一个原语转换为另一个原语,但没有足够的空间,您可能会丢失一些字节。

double x = 10.5;             // 8 bytes
int y = x;                   // 4 bytes ;  raises compilation error

您应该查找基元documentation