23.基础语法-类型转换案例
23 类型转换案例
23.1 转换需求
需求:根据用户输入的年龄,计算用户的最佳燃脂心率
说明:
最佳燃脂心率范围通常是人的最大心率的 60% 至 80% 之间,因此计算步骤如下:
1.计算最大心率
最大心率 = 220 - 年龄
2.计算燃脂心率范围
最低燃脂心率 =(最大心率)* 0.6
最高燃脂心率 =(最大心率)* 0.8
23.2 演示
鼠标放到 chap05 行,新建 New -> Java Class -> 输入 HeartRateDemo(创建类)
package com.itheima.chap05; import java.util.Scanner; public class HeartRateDemo { public static void main(String[] args) { // 1.键盘录入获取用户年龄 Scanner scanner = new Scanner(System.in); System.out.print("请输入用户年龄:"); byte age = scanner.nextByte(); // byte 在 java 中范围是 -128 ~ 127 // 2.计算用户最大心率 // 整数字面量默认为int类型, 在算术运算中,参与运算的数据都会被自动类型转换为参与运算的最大类型 // byte maxHeartRate = 220 - age; // 报错 220 字面量默认是int类型, 因此 maxHeartRate 是运算最大类型 int int maxHeartRate = 220 - age; // 3.计算最佳燃脂心率范围 // 强转:分先强转再运算, 还是先运算结果再对结果强转, 下面是先运算结果再对结果强转, 因此要有括号, 增加优先级 int targetHeartRate1 = (int)(maxHeartRate * 0.6); // maxHeartRate * 0.6 是 double 类型, maxHeartRate 是 int 类型, 0.6 double 类型, 因此是 double 类型, double targetHeartRate2 = maxHeartRate * 0.8; // 上面采用强转, 下面采用浮点类型, 但是浮点类型打印出来, 用户查看心率区间不够友好 System.out.println("您的最大心率为:" + maxHeartRate); System.out.println("您最佳的燃脂心率范围是:" + targetHeartRate1 + " - " + targetHeartRate2); } } ------------------------------------------------ 执行后 D:\Software\jdk17\bin\java.exe "-javaagent:D:\Software\JetBrainsIntelliJ IDEA 2025.2.4\lib\idea_rt.jar=8874" -Dfile.encoding=UTF-8 -classpath D:\Software\JavaCode\p1-basic\out\production\p1-basic com.itheima.chap05.HeartRateDemo 请输入用户年龄:31 您的最大心率为:189 您最佳的燃脂心率范围是:113 - 151.20000000000002 Process finished with exit code 0
23.3 注意
赋值运算符中隐藏的 bug,默认强制转换造成(赋值 byte 类型时需注意!建议赋值使用 int 类型)
package com.itheima.chap05; public class Test { public static void main(String[] args) { // 1.赋值运算符, 隐藏强制转换 byte a = 10; a += 5; // a = a + 5, 其中 5 是 int, 计算前 a 是 byte, 计算后的结果本应该为 int, 但上面 a 被赋值为 byte 类型, 因此相当于 a = (byte)(a + 5) System.out.println(a); a += 1025; // a = 15 + 1025, a = 1040, 但 a 被赋值 byte 类型, 因此造成数据丢失 System.out.println(a); } } ------------------------------------------------ 执行后 D:\Software\jdk17\bin\java.exe "-javaagent:D:\Software\JetBrainsIntelliJ IDEA 2025.2.4\lib\idea_rt.jar=10329" -Dfile.encoding=UTF-8 -classpath D:\Software\JavaCode\p1-basic\out\production\p1-basic com.itheima.chap05.Test 15 16 Process finished with exit code 0
23.4 小结
一、什么是自动类型转换?
数值范围小的数据类型自动提升为数值范围大的类型
// 1.数值范围小的变量直接赋值给数值范围大的变量,自动类型转换 byte x = 10; int y = x; // 2.算术运算中,数值范围小的数据类型会自动提升为运算中数值范围大的数据类型 byte x = 10; int z = x + 20
二、什么是强制类型转换?
将一种数据类型强制转换为另一种数据类型
// 1.数值范围大的变量赋值给数值范围小的变量,需要强制转换 int x = 10; byte y = (byte) x; // 2.算术运算结果强制转换 int x = 10; byte z = (byte)(x + 10); // 30 // 3. +=、-=、*=、/= 等运算符隐含强制类型转换 byte a =10; a += 10; // 等同于 a = (byte)(a + 10);
23.5 贷款计算器
需求:设计一个还款计算器的程序,假设用户采用等额本息方案贷款。用户输入贷款金额(元)、贷款期限(年)、贷款年华利率(x%),计算出用户每月需要还款的金额。
鼠标放到 chap05 行,新建 New -> Java Class -> 输入 LoanCalculator(创建类)
import java.util.Scanner; import java.text.DecimalFormat; public class LoanCalculator { /** * 计算等额本息每月还款金额 * * @param principal 贷款本金(元) * @param years 贷款年限 * @param annualRatePercent 年利率(例如 4.5 表示 4.5%) * @return 每月还款金额(保留两位小数) */ public static double calculateMonthlyPayment(double principal, double years, double annualRatePercent) { if (principal <= 0 || years <= 0 || annualRatePercent < 0) { throw new IllegalArgumentException("贷款金额和年限必须大于0,利率不能为负。"); } double monthlyRate = annualRatePercent / 100 / 12; // 月利率 int totalMonths = (int) Math.round(years * 12); // 总月数(支持小数年份) if (monthlyRate == 0) { return round(principal / totalMonths); } double power = Math.pow(1 + monthlyRate, totalMonths); double numerator = monthlyRate * power; double denominator = power - 1; double monthlyPayment = principal * (numerator / denominator); return round(monthlyPayment); } /** * 保留两位小数(四舍五入) */ private static double round(double value) { return Math.round(value * 100.0) / 100.0; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); DecimalFormat df = new DecimalFormat("#,##0.00"); System.out.println("=== 等额本息贷款计算器 ==="); try { System.out.print("请输入贷款金额(元):"); double principal = scanner.nextDouble(); System.out.print("请输入贷款期限(年):"); double years = scanner.nextDouble(); System.out.print("请输入年利率(%):"); double annualRate = scanner.nextDouble(); double monthlyPayment = calculateMonthlyPayment(principal, years, annualRate); double totalPayment = monthlyPayment * Math.round(years * 12); double totalInterest = totalPayment - principal; System.out.println("\n--- 计算结果 ---"); System.out.println("贷款金额:" + df.format(principal) + " 元"); System.out.println("贷款年限:" + years + " 年"); System.out.println("年利率:" + String.format("%.2f", annualRate) + "%"); System.out.println("每月还款:" + df.format(monthlyPayment) + " 元"); System.out.println("总还款额:" + df.format(totalPayment) + " 元"); System.out.println("总利息:" + df.format(totalInterest) + " 元"); } catch (IllegalArgumentException e) { System.err.println("输入错误:" + e.getMessage()); } catch (Exception e) { System.err.println("输入格式错误,请输入有效数字。"); } finally { scanner.close(); } } } ------------------------------------------------ 执行后 D:\Software\jdk17\bin\java.exe "-javaagent:D:\Software\JetBrainsIntelliJ IDEA 2025.2.4\lib\idea_rt.jar=14126" -Dfile.encoding=UTF-8 -classpath D:\Software\JavaCode\p1-basic\out\production\p1-basic LoanCalculator === 等额本息贷款计算器 === 请输入贷款金额(元):1600000 请输入贷款期限(年):30 请输入年利率(%):4.35 --- 计算结果 --- 贷款金额:1,600,000.00 元 贷款年限:30.0 年 年利率:4.35% 每月还款:7,964.99 元 总还款额:2,867,396.40 元 总利息:1,267,396.40 元 Process finished with exit code 0
———————————————————————————————————————————————————————————————————————————
无敌小马爱学习
浙公网安备 33010602011771号