【问题标题】:Int can be incremented by a double valueInt 可以增加一个 double 值
【发布时间】:2023-04-05 03:21:02
【问题描述】:

这段代码似乎可以在 Java 中运行,违反了我认为我所知道的关于该语言的所有内容:

int x = 0;
x += 7.4;

x 现在的值为 7。当然,不能只写 int x = 7.4,所以这种行为对我来说似乎很奇怪且不一致。

为什么Java的开发者会选择这样的行为?

我被标记为重复的问题实际上是在回答“发生了什么”部分,但不是我的主要问题:基本原理是什么。

【问题讨论】:

  • 因为+= 隐式转换为int,请查看this
  • 谢谢。这回答了“正在发生的事情”部分。我已经澄清了我的问题。
  • 试试char ch = '0'; ch *= 1.1; assert ch == '4';
  • 这来自C,可能是一种较旧的语言。
  • Java += operator的可能重复

标签: java casting floating-point int double


【解决方案1】:

数字运算符会进行各种类型的转换,在这种情况下通过四舍五入将 7.4 double 转换为 7 int。

你这里有一个Compound Assignment Operators

所以真正被执行的是

x= (int)(x + 7.4)

由于 x 是一个 int 并且 7.4 x 被转换为 double 而不是 Binary Numeric Promotion 所以你得到 7.4 作为中间结果。

然后将结果(双精度数)转换为 Narrowing Primitive Conversion,将其四舍五入为 7

关于新问题:为什么要这样做?

好吧,如果隐式转换是好事还是坏事,您可以争论很长时间。 Java 在原语、盒装类型和字符串之间进行了一些转换,走上了某种中间道路。

+= 运算符具有相当简单和直接的语义。如果您将其视为 increment by 运算符,它实际上看起来很奇怪,而不是它的真正含义:运算符和赋值组合的简写。

【讨论】:

    【解决方案2】:

    以前只有我读过它 实际上会 X= (int)(x + 7.4)

    【讨论】:

      【解决方案3】:

      没有。这并不矛盾。它舍入到最近的模式。

      https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

      将 int 或 long 值转换为 float,或将 long 值转换为 double,可能会导致精度损失 - 也就是说,结果可能会丢失值的某些最低有效位。在这种情况下,生成的浮点值将是整数值的正确舍入版本,使用 IEEE 754 舍入到最近模式(第 4.2.4 节)。

      【讨论】:

        【解决方案4】:

        我认为 x = 7 由于基本转换

        【讨论】:

          猜你喜欢
          • 2011-04-18
          • 2016-07-02
          • 1970-01-01
          • 2016-11-17
          • 2016-05-24
          • 2014-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多