Java基础之数值类型之间的转换

  经常需要将一种数值类型转换为另一种数值类型。下图 给出了数值类型之间的合法 转换。

在图中有 6 个实心箭头,表示无信息丢失的转换;有 3 个虚箭头, 表示可能有精度 损失的转换。 例如,123 456 789 是一个大整数, 它所包含的位数比 float 类型所能够表达的 位数多。 当将这个整型数值转换为 float 类型时,将会得到同样大小的结果,但却失去了一定 的精度。 int n = 123456789; float f= n;//f is 1.23456792E8 当使用上面两个数值进行二元操作时(例如 n + f,n 是整数,f 是浮点数), 先要将两个操作数转换为同一种类型,然后再进行计算。

•如果两个操作数中有一个是 double 类型, 另一个操作数就会转换为 double 类型。

•否则,如果其中一个操作数是 float 类型,另一个操作数将会转换为 float 类型。

•否则, 如果其中一个操作数是 long 类型, 另一个操作数将会转换为 long 类型。

•否则, 两个操作数都将被转换为 int 类型。 

 

   在必要的时候, int类型的值将会自动地转换为 double 类型。但另 一方面,有时也需要将 double转换成 int。 在 Java中, 允许进行这种数值之间的类型转换。 当然, 有可能会丢失一些信息。在这种情况下,需要通过强制类型转换(cast) 实现这个操 作。强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,后面紧跟待转换的变 量名。例如: double x * 9.997; int nx = (int) x; 这样, 变量 nx 的值为 9。强制类型转换通过截断小数部分将浮点值转换为整型。 如果想对浮点数进行舍人运算, 以便得到最接近的整数(在很多情况下, 这种操作更有 用),那就需要使用 Math_round 方法: double x z 9.997; int nx = (int) Math.round(x); 现在, 变量 nx 的值为 10。 当调用 round 的时候, 仍然需要使用强制类型转换(int)。其原因 是 round 方法返回的结果为 long 类型,由于存在信息丢失的可能性,所以只有使用显式的强 制类型转换才能够将 long 类型转换成 int 类型。

警告: 如果试图将一个数值从一种类型强制转换为另一种类型, 而又超出了目标类型的 表示范围,结果就会截断成一个完全不同的值。例如,(byte) 300 的实际值为 44。

   

posted on 2020-09-29 15:45  王半仙儿的博客  阅读(409)  评论(0编辑  收藏  举报

导航