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

———————————————————————————————————————————————————————————————————————————

                                                                                                                         无敌小马爱学习

posted on 2025-12-16 15:17  马俊南  阅读(6)  评论(0)    收藏  举报