基于电压计算功率/电流的工具开发问题:双向计算功能异常
功率/电流双向计算工具问题
我正在开发一款工具,可根据给定的电压(Voltage)计算所需的功率(Watts)或电流(Amps),需求如下:
- 输入电压与电流时,自动计算功率
- 输入电压与功率时,自动计算电流
- 修改功率或电流数值后,点击计算按钮可重新触发对应计算
目前单独注释掉功率或电流的计算代码时,对应功能能正常运行,但无法同时实现双向计算。以下是存在问题的代码片段:
int Amperage = 0; int Voltage = 0; int Wattage = 0; int TotalNeed = 0; private void Form1_Load(object sender, EventArgs e) { TxtWattage.MaxLength = 16; TxtAmperage.MaxLength = 16; TxtVoltage.MaxLength = 16; TxtVoltage.Text = "0"; TxtAmperage.Text = "0"; TxtWattage.Text = "0"; Amperage = Convert.ToInt16(TxtAmperage.Text); Wattage = Convert.ToInt16(TxtWattage.Text); Voltage = Convert.ToInt16(TxtVoltage.Text); } private void BtnCalculate_Click(object sender, EventArgs e) { Amperage = Convert.ToInt16(TxtAmperage.Text); Wattage = Convert.ToInt16(TxtWattage.Text); Voltage = 12; // this is where I am stuck. I can get either one to work if I comment out the other one. //I want to be able to change either the wattage or amperage and then click the button to calculate the other one. // Calculate wattage if(TxtWattage.Text == "") { Wattage = Voltage * Amperage; TxtWattage.Text = Wattage.ToString(); } else if(TxtAmperage.Text == "") { // Calculate amperage Amperage = Wattage / Voltage; TxtAmperage.Text = Amperage.ToString(); } }
问题根源
- 判断逻辑失效:仅通过文本框是否为空来决定计算方向,但用户修改数值后文本框不会为空,导致后续计算无法触发
- 电压值被硬编码:代码里强制把
Voltage设为12,直接忽略了用户在文本框中输入的电压值 - 整数精度丢失:用
int类型存储数值会导致除法运算丢失小数精度(比如13W/12V的实际电流是1.08A,但整数除法会得到1A) - 无输入验证:直接用
Convert.ToInt16转换用户输入,若用户输入非数字会直接报错
修复后的代码
// 改用double存储数值,保留小数精度 double Amperage = 0; double Voltage = 0; double Wattage = 0; int TotalNeed = 0; private void Form1_Load(object sender, EventArgs e) { TxtWattage.MaxLength = 16; TxtAmperage.MaxLength = 16; TxtVoltage.MaxLength = 16; TxtVoltage.Text = "0"; TxtAmperage.Text = "0"; TxtWattage.Text = "0"; } private void BtnCalculate_Click(object sender, EventArgs e) { // 先验证并读取输入值,避免转换失败报错 if (!double.TryParse(TxtVoltage.Text, out Voltage)) { MessageBox.Show("请输入有效的电压值"); return; } // 电压不能为0,避免除法错误 if (Voltage == 0) { MessageBox.Show("电压不能为0"); return; } double inputAmps = 0; double inputWatts = 0; bool hasAmps = double.TryParse(TxtAmperage.Text, out inputAmps); bool hasWatts = double.TryParse(TxtWattage.Text, out inputWatts); // 逻辑:如果有电流和电压,计算功率 if (hasAmps && !hasWatts) { Wattage = Voltage * inputAmps; TxtWattage.Text = Wattage.ToString("F2"); // 保留两位小数 } // 如果有功率和电压,计算电流 else if (hasWatts && !hasAmps) { Amperage = inputWatts / Voltage; TxtAmperage.Text = Amperage.ToString("F2"); } // 处理用户同时输入了电流和功率的情况 else if (hasAmps && hasWatts) { MessageBox.Show("请只输入电流或功率中的一项,另一项留空"); } else { MessageBox.Show("请输入电压,以及电流或功率中的一项"); } }
关键修改说明
- 将数值类型从
int改为double,保留小数精度,避免计算误差 - 使用
double.TryParse做输入验证,防止非数字输入导致程序崩溃 - 取消电压硬编码,读取用户输入的电压值,并添加电压不能为0的判断
- 调整计算逻辑:通过判断用户是否输入了电流/功率来决定计算方向,而非依赖文本框为空
- 用
ToString("F2")格式化输出,保留两位小数,结果更直观
内容的提问来源于stack exchange,提问作者Ed Swafford
相关产品推荐
相关产品推荐

