C# 中的数据类型转换详解
数据类型转换概述
在 C# 编程中,当对不同数据类型的变量进行运算时,必须确保它们具有相同类型。如果类型不一致,则需要进行类型转换。对于值类型而言,主要存在两种类型转换方式:隐式转换和显式转换。
隐式类型转换
隐式转换是编译器自动完成的,无需额外语法声明。它适用于从"小范围、低精度"类型向"大范围、高精度"类型的转换,例如从 int 到 double。这种转换是安全的,不会导致数据丢失。
C# 支持的常见隐式转换包括:
char→int,long,float,doubleshort→int,long,float,doubleint→long,float,doublelong→float,doublefloat→double
注意:char 类型不能隐式转换为 short,而 bool 类型与数值类型之间不允许任何转换。
案例:计算学生平均成绩
假设三名学生的成绩使用整型存储,但平均分希望以浮点数形式表示:
int score1, score2, score3;
double average = 0;
Console.WriteLine("请输入三位学生的成绩:");
score1 = int.Parse(Console.ReadLine());
score2 = int.Parse(Console.ReadLine());
score3 = int.Parse(Console.ReadLine());
average = (score1 + score2 + score3) / 3.0; // 使用 3.0 触发隐式转换
Console.WriteLine("平均成绩:" + average);
关键点在于除数使用了 3.0(double 类型),使得整个表达式提升为双精度浮点运算,从而保留小数部分。若使用整数除法(如 /3),结果将被截断为整数。
此外,在混合类型表达式中,所有操作数都会被提升为最大范围的类型。例如,int 与 double 运算时,int 会被自动转为 double。
显式类型转换(强制转换)
当需要将高精度或大范围类型转换为低精度或小范围类型时,必须使用显式转换。语法格式为:(目标类型)表达式。
这类转换存在风险,可能导致数据溢出或精度丢失,就像把大杯中的水倒入小杯一样,可能会溢出。
案例:分离数字的整数与小数部分
double number;
int integerPart;
double decimalPart;
Console.WriteLine("请输入一个数字:");
number = double.Parse(Console.ReadLine());
integerPart = (int)number; // 强制转换截断小数部分
decimalPart = number - integerPart;
Console.WriteLine("数字{0}的整数部分:{1},小数部分:{2}", number, integerPart, decimalPart);
运行程序并输入 6.78,输出结果正确显示整数部分为 6,小数部分为 0.78。
字符串与值类型之间的转换
字符串转值类型
使用各值类型的静态 Parse() 方法可将字符串解析为对应数值类型。
案例:计算商品总价
double unitPrice;
int quantity;
double totalPrice;
Console.WriteLine("请输入商品单价:");
unitPrice = double.Parse(Console.ReadLine());
Console.WriteLine("请输入购买数量:");
quantity = int.Parse(Console.ReadLine());
totalPrice = unitPrice * quantity;
Console.WriteLine("商品总价:" + totalPrice);
用户输入后,系统会自动将字符串转换为数值并完成乘法运算。
值类型转字符串
所有值类型都提供 ToString() 方法,用于将其转换为字符串表示形式。该方法支持格式化参数,可直接输出特定格式。
ToString("C"):货币格式ToString("F2"):保留两位小数的定点数ToString("P"):百分比格式(自动乘以 100 并添加 % 符号)
例如,将总价以货币形式输出:
Console.WriteLine("商品总价:" + totalPrice.ToString("C"));
根据当前系统的区域设置,金额将显示为带货币符号的格式(如 ¥76.50 或 $76.50)。
总结
本节重点介绍了 C# 中的类型转换机制:
- 隐式转换安全且自动发生,适用于精度提升场景;
- 显式转换需手动指定,可能造成数据损失;
- 字符串与数值间的互转通过
Parse()和ToString()实现; - 利用格式化字符串可直接生成美观的输出结果。