【问题标题】:explicit typecast float to byte显式类型转换浮点到字节
【发布时间】:2021-11-15 11:46:22
【问题描述】:

从浮点到字节的显式类型转换如何在 Java 中工作,为什么最后一个输出也是 -1 而不是 0? 57 的第一个输出可能是由于算术溢出,所以加 1 会产生 58,这对我来说很有意义。但因此我希望最后一个输出为 0。

public class Typecasts {

    public static void main(String[] args) {

        float f = 12345.0f;
        byte b = (byte) f;
        System.out.println(b); // output: 57
        b = (byte) (f + 1);
        System.out.println(b); // output: 58
        f = 12345678987654321.0f;
        b = (byte) f;
        System.out.println(b); // output: -1
        b = (byte) (f + 1);
        System.out.println(b); // output: -1
    }

}

【问题讨论】:

  • 这与转换为字节无关。 12345678987654321.0f 的值太大了,以至于 1 太小而不能给它另一个值(即 12345678987654321.0f == 12345678987654321.0f + 1true)。您需要添加 around1E9f 以获得另一个值! .

标签: java casting integer-overflow


【解决方案1】:

根据 Java 语言规范 § 5.1,从 floatbyte 的转换是一种缩小原语转换,这可能会导致丢弃最重要的字节。

然而,真正的问题在这里:像12345678987654321.0 这样的大量数字已经 损失了精度,甚至在执行类型转换之前。打印出f 的值已经暗示了这一点:

1.23456795E16

请参阅 Java 语言规范 § 4.2.3 和 § 4.2.4

浮点运算按照 IEEE 754 标准的规则执行,包括溢出和下溢。

另外,JLS § 15.4 定义了应该如何执行浮点表达式。读起来有点技术性,但简而言之,由于下溢,它会丢弃最低有效位。

因此,在您的情况下,f + 1 将只产生f

【讨论】:

  • 在这种情况下,丢失了最重要的数字(数字的大小)。
猜你喜欢
  • 1970-01-01
  • 2021-08-09
  • 2013-07-07
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
相关资源
最近更新 更多