为何Java中普通赋值存损失转换报错,而+=赋值无警告?
为什么Java中
k = k + Math.pow(...)报错而k += Math.pow(...)不报错? 先看两段代码的核心差异:
第一段报错代码:
int k = 0; k = k + Math.pow(2, 4); System.out.println(k);
这段会触发精度损失的编译错误,原因很明确:Math.pow()返回的是double类型值,k是int类型。执行k + Math.pow(...)时,int类型的k会被自动提升为double,运算结果也是double。Java不允许直接把double隐式赋值给int——因为double的数值范围和精度都比int大,直接赋值可能丢失数据(比如小数部分被截断),必须手动添加强制转换(int)才能通过编译。
第二段正常编译的代码:
int k = 0; k += Math.pow(2, 4); System.out.println(k);
这段能通过编译的核心原因是Java的复合赋值运算符(+=、-=、*=等)会自动执行隐式强制类型转换。
k += x这种写法在Java中等价于k = (T)(k + x),其中T是变量k的类型(这里就是int)。也就是说,编译器会自动把k + Math.pow(...)的double结果强制转换成int类型再赋值给k,因此不会触发编译错误。
需要注意的是:这种自动转换依然会损失精度,比如如果Math.pow返回16.9,最终k的值会被截断为16,只是编译器默认允许了这种转换行为。
内容的提问来源于stack exchange,提问作者Arham Ali
相关产品推荐
相关产品推荐

