为啥Java在使用“加号”运算符时会执行从双精度到整数的隐式类型转换? [复制]

Posted

技术标签:

【中文标题】为啥Java在使用“加号”运算符时会执行从双精度到整数的隐式类型转换? [复制]【英文标题】:Why does Java perform implicit type conversion from double to integer when using the "plus equals" operator? [duplicate]为什么Java在使用“加号”运算符时会执行从双精度到整数的隐式类型转换? [复制] 【发布时间】:2012-01-06 13:00:46 【问题描述】:

可能重复:Varying behavior for possible loss of precision

代码示例 A

 public class Test                                                          
     public static void main(String[] args) 
         int i = 0;
         i = i + 1.5;
     
 

代码示例 B

 public class Test                                                          
     public static void main(String[] args) 
         int i = 0;
         i += 1.5;
     
 

不出所料,编译 A 会产生以下错误。 出人意料地,编译 B 不会产生任何错误,而且它的表现就像我在双精度值 1.5 之前插入了一个显式转换为整数一样。为什么会发生这种情况?这与我以为我知道的一切背道而驰!

Test.java:6: possible

 loss of precision

    found   : double
    required: int
            i = i + 1.5;
                  ^
    1 error

【问题讨论】:

@Dave 在令人不安的部分是正确的。哦,没有语言是完美的。 :) 【参考方案1】:

它按设计工作。复合运算符向操作添加了隐式强制转换。否则,您必须使用显式强制转换。

更多信息?

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

【讨论】:

+1 很好的答案,但这里有一个更直接的链接:java.sun.com/docs/books/jls/third_edition/html/… 这个链接很公平。谢谢! 太棒了,谢谢你的链接,雷。 说“这就是他们想要的工作方式”与回答为什么它以这种方式工作的问题不同。任何人都可以为这个决定提供理由吗?从表面上看,在其他任何地方都需要显式转换的语言中,静默转换似乎很容易出错。 @EricLindauer:我希望它可以正常工作,因为算术运算符永远不会给出小于 int 的任何类型的结果,但 Java 希望允许 += 可用于较小的类型,并且Java 优先考虑使类型转换规则简单和“一致”,而不是允许有意义的事情而禁止可能错误的事情。【参考方案2】:

根据Java language specification, section 15.26.2:

E1 op= E2 形式的复合赋值表达式等价于 E1 = (T)((E1) op (E2)),其中 T 是 E1 的类型,除了 E1 只计算一次。 例如下面的代码是正确的:

short x = 3;
x += 4.6;

并导致 x 的值为 7,因为它等价于:

short x = 3;
x = (short)(x + 4.6);

【讨论】:

以上是关于为啥Java在使用“加号”运算符时会执行从双精度到整数的隐式类型转换? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 F# 有一个一元加号运算符?

在c ++中从双精度转换为字符串[重复]

04-JAVA高精度数字

为啥需要使用加号运算符 (Iterator<Item = &Foo> + 'a) 为特征添加生命周期?

为啥在 Ruby 中构建字符串时,铲子运算符 (<<) 优于加号 (+=)?

为啥加号运算符在 JavaScript 的正则表达式中不起作用? [复制]