Java数值类型赋值疑问:为何double字面量不能赋值给float变量,而int字面量可赋值给long变量?
Java数值类型赋值疑问:为何double字面量不能赋值给float变量,而int字面量可赋值给long变量?
嘿,这个问题问到点子上了!其实核心就是Java对数值类型转换的安全规则设计,咱们拆开唠明白:
int转long:安全的自动拓宽,编译器放心放行
Java里的整数类型,int的取值范围(-2³¹到2³¹-1)完全被long的范围(-2⁶³到2⁶³-1)包裹住了。把int赋值给long,就像把小盒子里的东西放进大盒子,绝对不会出现装不下或者丢东西的情况,这种转换是100%安全的。所以编译器会自动帮你把int字面量(比如4)转换成对应的long类型(等价于4L),直接赋值完全没问题。
举个代码例子:int i = 4; long x = i; // 合法!编译器自动完成int→long的转换double转float:有风险的窄化转换,编译器主动拦截
浮点数这边就不一样了,double是64位的高精度浮点数,float是32位的低精度浮点数——double的精度更高、取值范围也更大。如果直接把double赋值给float,很可能会丢失精度,甚至有些超大的double值根本没法用float表示。Java为了避免你不小心踩坑,默认不允许这种「窄化转换」自动发生。
看这段代码就懂了:double d = 4.0; float f = d; // 编译报错!因为double→float可能丢失精度要是非要赋值,要么手动加强制转换(
float f = (float)d;),要么直接用float类型的字面量(比如4.0f),相当于告诉编译器:“我知道有风险,我自己担着!”
总结一下:整数类型的拓宽转换是绝对安全的,所以编译器直接放行;而浮点数从高精度到低精度的转换存在隐患,所以编译器会默认拦截,必须你手动确认才行。
备注:内容来源于stack exchange,提问作者kaka
相关产品推荐
相关产品推荐

