java - 为什么 long 和 float 数据类型末尾需要 "F"和 "L"后缀?

标签 java

声明 long 或 float 时为什么需要“F”和“L”后缀?根据documentation :

An integer literal is of type long if it ends with the letter L or l; otherwise it is of type int.
A floating-point literal is of type float if it ends with the letter F or f; otherwise its type is double.

因此,显然编译器默认将这些值视为 int 数据类型或 double 数据类型。这对我来说并不能完全解释事情。

我挖得更深一点,发现了 discussion其中用户描述从 64 位 double 型转换为 32 位浮点型会导致数据丢失,设计者不想做出假设。

我还有疑问:

  1. 为什么编译器允许写入 byte myByte = 100;,并且编译器会自动将 100(如上所述的 int)转换为字节,但编译器不会允许long myLong = 3_000_000_000;?为什么它不会自动将 3_000_000_000 转换为 long,尽管它完全在 long 的范围内? Error converting 3_000_000_000 into long

  2. 如上所述,在设计 Java 时,设计者不会允许将 double 分配给 float,因为这样会造成数据丢失。虽然这对于超出 float 范围的值可能是正确的,但显然像 3.14 这样的值对于 float 来说已经足够小了。那么,为什么编译器会在赋值 float myFloat = 3.14; 时抛出错误?

最终,我无法完全理解为什么需要后缀,以及围绕自动转换的规则(如果这就是幕后发生的事情)等。

我知道这个话题之前已经讨论过,但给出的答案只会引发更多问题,所以我决定创建一个新帖子。

最佳答案

回答您的具体问题:

  1. long myLong = 3_000_000_000; 的问题是 3_000_000_000 不是合法的 int 文字,因为 3,000,000,000 不适合 4 个字节。事实上,您想要将其提升为 long 以初始化 myLong 是无关紧要的。 (是的,语言设计者可以设计语言,以便在这种情况下 3_000_000_000 可以被解析为 long ,但他们没有这样做,可能是为了使语言更简单并避免在其他情况下出现歧义。)
  2. 3.14 的问题不是范围问题,而是精度损失问题。特别是,虽然 3.14 以 10 为基数表示形式终止,但它没有二进制浮点的有限表示形式。因此,从 double 转换为 float (为了初始化 myFloat )将涉及截断表示的重要非零位。 (但需要明确的是:Java 认为从 doublefloat 的每次缩小转换都是有损的,无论涉及的实际值如何。因此 float myFloat = 3.0; 也会失败。但是,float myFloat = 3; 会成功,因为从 int 值到 float 的转换被认为是扩大转换。)

在这两种情况下,正确的做法是通过将适当的后缀附加到数字文字来向编译器准确指示您要执行的操作。

关于java - 为什么 long 和 float 数据类型末尾需要 "F"和 "L"后缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66305194/

相关文章:

java - 方法参数类型不匹配异常 : How to find the controller method

java - 我首先做什么 - 取消 ScheduledFuture 或关闭 ScheduledExecutorService?

java - Hibernate Criteria/Criterion with Restrictions 等于 POJO 的非空值

java - 使用 onCheckedChangeListener 清除多个单选组上的选定项目

java - Mockito 注入(inject)的 Web 模拟与使用 Spring Web 模拟 api 的不同

java - 我的应用程序按钮不起作用,handler.java 错误

java - SQLDeveloper 运行查询但从 hibernate 中获取 "ORA-00979: Not a Group By expression"

java - 如何使用 Java 8 Stream 拆分字符串并将所有信息分组到具有重复值的映射中?

java - Springboot -> Springboot 2 : 2 Spring WebApplicationInitializers detected on classpath

java - Android 中添加到 gradle 的类文件可以编辑吗?