基本数据类型转换
Java 中数据类型的转换有两种:
1.自动转换;
2.强制转换。
Java 中整型和浮点型按照范围从小到大:
byte -> short -> int -> long -> float -> double
字符型转换为整型: char -> int
自动转换
自动类型转换 (也叫隐式类型转换) ,其实就是小范围的数据类型向大范围的数据类型转换,你可以想象一下,把一杯水往一个容积大的空桶中倒进,水不会流出来。
注意:自动类型转换的前提条件,必须是把数据类型范围小的数值或变量赋给数据类型范围大的变量。
例子:
自动转换也要小心数据溢出问题,看下面的例子。
执行结果:
结果却输出的是负数,这是因为两个 int 相加得到的结果是 int,相加的结果超出了 int 的代表范围。这种情况,一般把第一个数据转换成范围大的数据类型再和其他的数据进行运算。
执行结果:
将整型转化为浮点型,例如:
也可以简写为:
执行结果为:
当范围小的数据与范围大的数据进行运算时,类型会自动转换为范围大的那个类型。所有的 byte 类型、short 类型、char 类型在运算时将被提升到 int 类型。
注意:char 类型比较特殊,char 自动转换成 int、long、float 和 double,但 byte 和 short 不能自动转换为 char,而且 char 也不能自动转换为 byte 或 short。
强制类型转换
强制类型转换 (也叫显式类型转换) ,其实就是大范围的数据类型向小范围的数据类型转换,它需要加强制转换符来实现强制转换。例子:
执行结果:
在强制类型转换中,如果是将浮点类型的值转换为整数,直接去掉小数点后边的所有数字;而如果是整数类型强制转换为浮点类型时,将在小数点后面补零。
强制转换需要注意两点:
1.把一个浮点数强制转换为整数时,Java 会直接截断浮点数的小数部分,造成数据丢失;
2.把一个超出数据范围的数值赋给数据类型时,会出现数据溢出的情况,造成数据的缺失。例如:int 类型的 a 的值为 249,将其强转为 byte 类型时结果会变为 -7,数据溢出。
实战一
变量 a 是一个 double 型的变量,请将其强转为 int 型,变量 b 是一个 short 型的变量,请将其转换为 double 型。
输出格式:先换行输出变量 a 转换后的结果,再不换行输出 b 转换后的结果。
/**
* 任务:变量 a 是一个 double 型的变量,请将其强转为 int 型,
* 变量 b 是一个 short 型的变量,请将其转换为 double 型。
* 输出格式:先换行输出变量 a 转换后的结果,再不换行输出 b 转换后的结果。
* 类名为:Transform
*/
import java.util.Scanner;
public class Transform {
public static void main(String[] args) {
//创建一个Scanner的实例对象,命名为reader
Scanner reader = new Scanner(System.in);
// double型变量a
double a = reader.nextDouble();
// short型变量b
short b = reader.nextShort();
// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********** Begin **********/
// 第一步:将double型变量a强转为int型
int c = (int)a;
// 第二步:将short型变量b转换为double型
double d = (double)b;
// 第三步:换行输出变量a转换后的结果
System.out.println(c);
// 第四步:不换行输出变量b转换后的结果
System.out.print(d);
/********** End **********/
}
}
实战二
假定一个用户初始时向一个储蓄帐户中存了 1000 元人民币,年利率为 2.25%。那么月利率为 0.0225/12=0.001875。第一个月后,账户金额变为 1000*(1+0.001875)=1001.875,第二个月后,账户金额变为 (1001.875) *(1+0.001875)=1003.75351563,依次类推。编写一个程序,四输出 6 个月后的账户金额,最后结果舍五入后保留两位小数。
/**
* 任务:假定一个用户每月向一个储蓄帐户中存 1000 元人民币,年利率为 2.25%。那么月利率为 0.0225/12=0.001875。
* 编写一个程序,输出 6 个月后的账户金额。
* 类名为:BankRate
*/
// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********** Begin **********/
// 第一步:创建一个名为 BankRate 的公开类
public class BankRate {
// 第二步:在这个类中定义主方法
public static void main(String[] args) {
// 第三步:在主方法中计算第六个月后总资金为多少
double money = 1000.0;
double annualRate = 0.0225;
double monthlyRate = annualRate/12;
int i;
for(i=0;i<6;i++)
{
money = (money)*(1 + monthlyRate);
}
// 第四步:格式化输出六个月后账户的总金额,结果保留两位小数
System.out.printf("%.2f",money);
}
}
/********** End **********/
实战三
编写程序,读入投资额、年利率和投资年限,利用下面公式计算投资的未来价值: 未来价值=投资额×(1+月利率)12∗年数 。
例如,如果输入投资额 1000、年利率 0.0325 和投资年限 1 年,则程序输出投资的未来价值为 1032.98 。
编程要求
仔细阅读右侧编辑区内给出的代码框架及注释,按照提示编写程序代码。
键盘第一次输入的值为投资额(double 型),第二次输入的值为年利率(double 型),第三次输入的值为年份数目(int 型),将未来价值四舍五入后保留两位小数输出。
/**
* 任务:编写程序,读入投资额、年利率和投资年限,利用题目所给公式计算投资的未来价值
* 类名为:Finance
*/
// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********** Begin **********/
// 第一步:导入Scanner类
import java.util.Scanner;
// 第二步:创建一个名为 Finance 的公开类
public class Finance{
// 第三步:定义主方法
public static void main(String[] args) {
// 第四步:在主方法中,根据题目给出的计算投资的未来价值公式来计算未来价值
Scanner input = new Scanner(System.in);
double investment = input.nextDouble();
double annualRate = input.nextDouble();
int year = input.nextInt();
double futureValue;
double monthlyRate = annualRate/12;
futureValue = investment*Math.pow(1+monthlyRate,12*year);
// 第五步:格式化输出未来价值,结果保留两位小数
System.out.printf("%.2f",futureValue);
}
}
/********** End **********/